为什么我的for循环跳过列表中的元素?

发布于 2021-01-29 14:11:01

我有一个整数列表,我正在运行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

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

关注者
0
被浏览
315
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    • 最接近当前方法:使用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)


    但是,您可以做得更好。由于您正在寻找一对加起来等于某个目标编号的数字,因此只需从目标中减去第一个即可获得第二个,然后查看第二个数字是否在数字列表中。使用aset可以使查询在恒定时间内进行,从而将您的整体时间复杂度从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)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看