![](/img/trans.png)
[英]why my for loop is skipping elements in list even if not manipulating the iterating list?
[英]Why is my for loop skipping an element in my list?
我有一個整數列表,我通過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()
以便第二個for
循環不會使用原始值,然后下一次迭代可以繼續迭代列表中的下一個元素。
您嘗試執行的操作將不起作用,因為您在迭代列表時正在修改它。 假設當前的“指針”指向第一個元素。 現在你彈出第一個,所以指針在第二個。 但是當循環前進時,指針移動到第三個,第二個被跳過。
您似乎想從列表中查找組合。 您還可以嘗試其他幾種方法:
最接近您當前的方法:使用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)
你需要選擇另一種方法。 不允許在使用 for 循環迭代列表時從列表中刪除元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.