如果循环中的语句不起作用

时间:2013-05-31 00:10:00

标签: python

对于我的生活,我无法弄清楚为什么我的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)

5 个答案:

答案 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()