修改列表中的每个元素。

5

我认为这个问题很简单,但是找不到答案。
我有一个长度为2的元组列表。
我想要得到一个长度为3的元组列表,其中第三个元素是对其他两个元素进行某种操作的结果。
例如:

for val_1, val_2 in list_of_tuples
    #...
    #some multi line operation
    #...
    val_3 = result
    replace (val_1, val_2) by (val_1, val_2, val_3) in list

有什么想法吗?

4
在使用for循环遍历列表时,不能(不应该)修改该列表。您真正想做什么?您是想用所需内容创建一个新列表,还是要在开始时创建一个副本并遍历该副本呢? - Kevin
3个回答

10

使用列表推导式。

>>> list_of_tups = [(1,2),(2,3),(3,4)]
>>> [(i,j,i+j) for i,j in list_of_tups]
[(1, 2, 3), (2, 3, 5), (3, 4, 7)]

现在将它重新分配回去

>>> list_of_tups = [(i,j,i+j) for i,j in list_of_tups]

迭代列表时不要修改其内容,否则可能会产生一些负面影响。


2
如果您真的想要替换它,请执行 list_of_tups[:] = ... - acushner
@acushner 在这里重新分配它就可以了 :-) - Bhargav Rao
这并没有帮助。我无法在列表推导式中压缩多行操作。在你的例子中,操作非常简单:i+j。 - José
是的,我只是在回答用户的具体问题。我不想做出假设,认为这是可以的,但根据他的经验,很可能是可以的。 - acushner
4
当然可以使用列表推导式来执行多行操作。只需将它放入一个函数中,然后在列表推导式中调用该函数即可。 - Bhargav Rao
@José下面的回答清楚地解释了我上面的评论。 - Bhargav Rao

5
对于多行操作,很容易实现。
def f(i, j):
    # math here
    # more math here
    return new_result

然后

result = [(i, j, f(i, j)) for i, j in tuples]

1
我正在编写一个不错的数学函数,但当我看到这个答案时,我停下了。 :-) - Bhargav Rao

4
你可以这样做:
for index, (val_1, val_2) in enumerate(list_of_tuples):
    # do stuff
    val_3 = # something
    list_of_tuples[index] = (val_1, val_2, val_3)

6
在这种情况下,它们既不插入也不删除元素,因此这不会引起问题。如果它们正在执行追加或弹出操作,那就是另一回事了。语句“不要修改你正在迭代的内容”在某些情况下是正确的,但在这种情况下不是。 - Cory Kramer
这对我来说很好用。我更喜欢使用它,而不是像其他答案建议的那样定义一个函数和使用列表推导式。 - José

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接