【发布时间】:2015-10-26 11:16:41
【问题描述】:
我有一个整数列表,我正在通过for-loop 来发现两个元素的总和是否等于另一个变量t。所以如果t 等于10 并且我有一个整数列表:
l = [1,2,3,4,5,8,9],那么函数应该打印所有不同的数字组合(1,9),(2,8)。
我觉得我快到了,但是当我使用.pop() 函数时,列表发生了一些奇怪的事情。下面的代码用于显示需要计算的所有数字组合,但会跳过列表中的所有其他元素。
l = [1,2,5,8,13,15,26,38]
c = 10
for i in l:
first = i
l.pop(0)
for x in l:
second = x
print(first,second)
这是输出:
1 2
1 5
1 8
1 13
1 15
1 26
1 38
5 5
5 8
5 13
5 15
5 26
5 38
13 8
13 13
13 15
13 26
13 38
26 13
26 15
26 26
26 38
注意2、8、15 和38 是如何被跳过的。
我正在使用l.pop(),以便第二个for-loop 不会使用原始值,然后下一次迭代可以继续迭代列表中的下一个元素。
【问题讨论】:
-
我当然不是 Python 专家,但我可以告诉你,在其他面向对象的语言中,修改迭代器或从循环中迭代的集合通常被认为是一个非常糟糕的主意.我的第一个怀疑就在这里。您从列表中弹出,然后尝试在幕后引用 list[1]...但 list[1] 现在是 5,而不是您期望的 2,因为您已经修改了列表。
-
我认为@DavidHoelzer 得到了正确答案。
-
@AndrewRushton:这是一个相当人为的约束......如果您在列表上迭代 _backwards,您可以安全地从当前正在迭代的列表中删除元素,尽管遍历列表的副本更安全。 BTW
.pop(0)效率相当低,因为它强制列表将所有剩余的列表元素向下移动以填补空白。