对于我的生活,我无法弄清楚为什么我的IF声明没有被击中。在很多情况下,结果列表中输入的最后一个数字的余数为0。
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)
答案 0 :(得分:3)
问题是你在迭代它时修改列表,所以所有偶数都被跳过了。因此,if
条件始终为False
。
for
循环跟踪索引,因此当您删除索引i
处的项目时,i+1
位置的下一个项目将转移到当前索引({{1} })因此在下一次迭代中你实际上会选择i
项。
i+2
示例:
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 :(得分:3)
不要遍历要从中删除项目的列表。 for
循环创建一个列表迭代器,通过递增计数器来跟踪当前项。但是缩小的列表意味着计数器将从循环迭代到循环迭代,指向错误的项目:
>>> lst = range(5)
>>> for i in lst:
... lst.remove(i)
... print i
...
0
2
4
>>> lst
[1, 3]
当您从列表0
中删除[0, 1, 2, 3, 4]
时,计数器会递增到项1
,在现在更改的列表[1, 2, 3, 4]
中指向价值2
。从列表中删除2
,迭代器计数增加到2
,并在更改的列表[1, 3, 4]
中,这意味着循环中的下一个值是4
,之后是迭代器计数器已超过结束,循环结束。
如果您要从列表中删除所有项目,请使用while循环:
while numbers:
n = numbers.pop()
# do something with `n`
如果要移除某些项目,另一个选项是创建浅色副本:
for n in numbers[:]:
# ....
现在,您可以将numbers
更改为您的内容,因为for
循环正在迭代副本。
答案 2 :(得分:0)
列表修改的另一种方法是进行两次传递:
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 ]
答案 3 :(得分:0)
正如其他人所回答的那样,问题在于修改您正在迭代的列表。我认为你真正想做的事情可以这样做:
results = [2]
numbers = []
n=100
for n in range(3, n):
if n % results[-1] == 0:
results.append(n)
else:
numbers.append(n)
这是获得两个权力的方法。另一种方式是:
results = [2**n for n in range(1,7)]
答案 4 :(得分:0)
如果你想在循环时修改一个列表,请跟我的小朋友while statement:
numbers=range(1,20)
while numbers:
if numbers[-1] % 2:
print "If statement", numbers.pop()
else:
print "Else statement", numbers.pop()