if statement in loop not working
本问题已经有最佳答案,请猛点这里访问。
在我的一生中,我不明白为什么我的if语句没有受到影响。在很多情况下,n//结果列表中最后一个数字的余数为0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | n = 100 numbers = range(2, n) results = [] results.append(numbers.pop(0)) print numbers for n in numbers: if n % results[-1] == 0: print"If statement", numbers numbers.remove(n) else: print"Else statement", numbers numbers.remove(n) |
不要循环访问要从中删除项目的列表。
1 2 3 4 5 6 7 8 9 10 | >>> lst = range(5) >>> for i in lst: ... lst.remove(i) ... print i ... 0 2 4 >>> lst [1, 3] |
当你把
如果要从列表中删除所有项,请使用while循环:
1 2 3 | while numbers: n = numbers.pop() # do something with `n` |
。
如果要删除某些项目,另一个选项是创建一个浅副本:
1 2 | for n in numbers[:]: # .... |
现在您可以将
问题是您在迭代列表时修改了它,所以所有偶数都将被跳过。因此,
1 2 3 4 5 6 7 | for n in numbers[:]: #iterate over a shallow copy of list if n % results[-1] == 0: print"If statement", numbers numbers.remove(n) else: print"Else statement", numbers numbers.remove(n) |
例子:
1 2 3 4 5 6 7 8 9 10 11 | >>> lis = range(3,15) >>> for x in lis: ... print x ... lis.remove(x) ... 3 5 7 9 11 13 |
号
如果要在循环遍历列表时修改列表,请与我的小朋友while语句会面:
1 2 3 4 5 6 | numbers=range(1,20) while numbers: if numbers[-1] % 2: print"If statement", numbers.pop() else: print"Else statement", numbers.pop() |
。
正如其他人所回答的那样,问题在于您正在迭代的列表的修改。我认为你真正想做的事情可以这样做:
1 2 3 4 5 6 7 8 9 | results = [2] numbers = [] n=100 for n in range(3, n): if n % results[-1] == 0: results.append(n) else: numbers.append(n) |
。
这是一种获得二次幂的方法。另一种方法是:
1 | results = [2**n for n in range(1,7)] |
列表修改的另一种方法是执行两个步骤:
1 2 3 4 5 | mod0 = [] for n in numbers: mod0.append(n % results[-1] == 0) print [ n for n,m in zip(numbers, mod0) if m ] print [ n for n,m in zip(numbers, mod0) if not m ] |
。