Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的for循环跳过列表中的一个元素?_Python_Loops_For Loop - Fatal编程技术网

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)
效率很低,因为它迫使列表向下移动所有剩余的列表元素以填补空白。