【问题标题】:Why is my for loop skipping an element in my list?为什么我的 for 循环会跳过列表中的元素?
【发布时间】: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

注意281538 是如何被跳过的。 我正在使用l.pop(),以便第二个for-loop 不会使用原始值,然后下一次迭代可以继续迭代列表中的下一个元素。

【问题讨论】:

  • 我当然不是 Python 专家,但我可以告诉你,在其他面向对象的语言中,修改迭代器或从循环中迭代的集合通常被认为是一个非常糟糕的主意.我的第一个怀疑就在这里。您从列表中弹出,然后尝试在幕后引用 list[1]...但 list[1] 现在是 5,而不是您期望的 2,因为您已经修改了列表。
  • 我认为@DavidHoelzer 得到了正确答案。
  • @AndrewRushton:这是一个相当人为的约束......如果您在列表上迭代 _backwards,您可以安全地从当前正在迭代的列表中删除元素,尽管遍历列表的副本更安全。 BTW .pop(0) 效率相当低,因为它强制列表将所有剩余的列表元素向下移动以填补空白。

标签: python loops for-loop


【解决方案1】:

您尝试执行的操作将不起作用,因为您在迭代列表时正在修改列表。说当前的“指针”指向第一个元素。现在你弹出第一个,所以指针在第二个。但是当循环前进时,指针移动到第三个,第二个被跳过。

您似乎想从列表中查找组合。您可以尝试其他几种方法:

  • 最接近您当前的方法:使用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.combinations

    import itertools
    for first, second in itertools.combinations(l, 2):
        print(first, second)
    

但是,您可以做得更好。由于您正在寻找一对加起来等于某个目标数字的数字,因此只需从目标中减去第一个数字即可得到第二个数字,然后查看第二个数字是否在数字列表中。使用set 使此查找在恒定时间内发生,从而将您的整体时间复杂度从 O(n²) 降低到 O(n)。

numbers = set([1,2,5,8,13,15,26,38])
target = 10
for first in numbers:
    second = target - first
    if second > first and second in numbers:
        print(first, second)

【讨论】:

    【解决方案2】:

    您需要选择另一种方法。使用 for 循环遍历列表时,不允许从列表中删除元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2021-06-21
      • 2021-10-10
      • 1970-01-01
      • 2019-03-21
      相关资源
      最近更新 更多