【问题标题】:iterate till the end of second array using python使用python迭代直到第二个数组的末尾
【发布时间】:2018-01-09 06:32:28
【问题描述】:

我做过这样的事情:

d = [('e', 0), ('f', 1), ('e', 0), ('f', 1)]
e = ['a']
d = [(n,j) for n,(i,j) in zip(e,d)]
d
[('a',0)]

我只是尝试用数组值替换等效的元组值,而不更改关联的数字。但该列表只到数组e 的长度,而不是d。我想得到的输出是这样的:

d
[('a', 0), ('f', 1), ('e', 0), ('f', 1)]

【问题讨论】:

    标签: python list python-3.x tuples


    【解决方案1】:

    如果改变原始d 列表是可以接受的,我只需通过迭代e 来替换第一个d 元组:

    d = [('e', 0), ('f', 1), ('e', 0), ('f', 1)]
    e = ['a']
    
    for i, new_letter in enumerate(e):
        d[i] = (new_letter, d[i][1])
    
    print(d)
    # [('a', 0), ('f', 1), ('e', 0), ('f', 1)]
    

    请注意,Python 元组是不可变的。 d[i][0] = new_letter 会因错误而失败:

    TypeError: 'tuple' 对象不支持项目分配

    上面的代码通过用新元组替换旧元组来修改d 列表。它不能修改旧的元组。

    【讨论】:

    • 我也试过了。它给了我错误说:'tuple' object does not support item assignment 因此我拒绝了这个想法
    • 说真的,我的上帝。它也起作用了。我仍然怀疑自己做错了什么,而我之前遵循了类似的过程。
    • 是的..我明白了。问题在于我所做的价值分配。你已经分配了这样的值 d[i] = (new_letter, d[i][1]) 我像这样分配了 d[i][0] = new_letter
    【解决方案2】:

    你可以使用itertools.zip_longest:

    [(n or i, j) for n,(i,j) in itertools.zip_longest(e, d)]
    

    查看doc

    【讨论】:

    • @Jean-FrançoisFabre,是的,我没有看到 py3 标签,谢谢!
    • 您可以删除fillvalue=None,因为这是默认设置。
    【解决方案3】:

    我认为问题在于 zip 功能。文档说 (zip) “返回元组的迭代器,其中第 i 个元组包含来自每个参数序列或迭代的第 i 个元素。当最短的输入迭代用尽时,迭代器停止。”

    [(n,j) for n,(i,j) in zip(e,d)] + d[len(e):] 应该可以解决问题

    【讨论】:

    • 感谢您的解释。但是让我编辑您的帖子以正确格式化。
    【解决方案4】:

    只需将d的未处理尾部添加到已处理部分即可:

    [(n,j) for n,(i,j) in zip(e,d)] + d[len(e):]
    #[('a', 0), ('f', 1), ('e', 0), ('f', 1)]
    

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2010-12-04
      • 2014-09-06
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-22
      • 2015-10-01
      • 2015-07-22
      相关资源
      最近更新 更多