Python 为什么我的for循环跳过列表中的一个元素?
我有一个整数列表,我正在运行Python 为什么我的for循环跳过列表中的一个元素?,python,loops,for-loop,Python,Loops,For Loop,我有一个整数列表,我正在运行for-循环,以发现两个元素的总和是否等于另一个变量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(
for
-循环,以发现两个元素的总和是否等于另一个变量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()
,这样-循环的第二个将不会使用原始值,下一次迭代可以继续迭代列表中的下一个元素。您尝试执行的操作将不起作用,因为您在迭代列表时正在修改列表。假设当前“指针”指向第一个元素。现在您弹出第一个,因此指针位于第二个。但是当循环前进时,指针移动到第三个,第二个被跳过
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)
似乎您希望从列表中查找组合。您还可以尝试其他几种方法:
- 最接近您当前的方法:使用
while
循环,而不是for
循环
while l:
first = l.pop(0)
for second in l:
print(first, second)
- 或者您可以迭代索引而不是列表本身:
for i in range(len(l)):
for k in range(i+1, len(l)):
print(l[i], l[k])
- 或者只使用
itertools.compositions
import itertools
for first, second in itertools.combinations(l, 2):
print(first, second)
然而,你可以做得更好。因为您正在寻找一对数字,这些数字加起来就是某个目标数字,所以只需从目标中减去第一个数字,就可以得到第二个数字,然后查看第二个数字是否在数字列表中。使用集合
使此查找在固定时间内进行,从而将总体时间复杂度从O(n²)降低到O(n)
你需要选择另一种方法。在使用for循环对列表进行迭代时,不允许从列表中删除元素。我当然不是Python专家,但我可以告诉您,在其他面向对象语言中,修改循环中迭代的迭代器或集合通常被认为是一个非常糟糕的主意。我的第一个怀疑就在这里。您从列表中弹出,然后尝试在幕后引用列表[1]。。。但是列表[1]现在是5,而不是你期望的2,因为你已经修改了列表。我认为@DavidHoelzer得到了正确的答案。@AndrewRushton:这是一个相当人为的约束。。。如果向后迭代列表,则可以安全地从当前正在迭代的列表中删除元素,尽管迭代列表的副本更安全。顺便说一句,pop(0)
效率很低,因为它迫使列表向下移动所有剩余的列表元素以填补空白。