关于python:if循环语句不起作用

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)


不要循环访问要从中删除项目的列表。for循环创建一个列表迭代器,通过增加计数器来跟踪当前项。但缩小的列表意味着计数器将从循环迭代到循环迭代指向错误的项:

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]

当你把0从清单[0, 1, 2, 3, 4]中删除时,计数器增加到项目1,在现在修改过的清单[1, 2, 3, 4]中,它指向值2。从列表中删除2,迭代器计数增加到2和修改后的列表[1, 3, 4]中,这意味着循环中的下一个值是4,在此之后迭代器计数器计数超过结束,循环终止。

如果要从列表中删除所有项,请使用while循环:

1
2
3
while numbers:
    n = numbers.pop()
    # do something with `n`

如果要删除某些项目,另一个选项是创建一个浅副本:

1
2
for n in numbers[:]:
     # ....

现在您可以将numbers改为hearts内容,因为for循环正在迭代副本。


问题是您在迭代列表时修改了它,所以所有偶数都将被跳过。因此,if条件总是False条件。

for循环跟踪索引,因此当您删除索引i中的一个项目时,i+1的下一个项目移到当前索引(i中,因此在下一个迭代中,您将实际选择i+2中的第一个项目。

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 ]