1

对于我的一生,我无法弄清楚为什么我的 IF 语句没有受到打击。在很多情况下,n 的余数 // 最后一个放在结果列表中的数字是 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)
4

5 回答 5

4

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

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

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)

例子:

>>> lis  = range(3,15)
>>> for x in lis:
...     print x
...     lis.remove(x)
...     
3
5
7
9
11
13
于 2013-05-31T00:15:11.723 回答
3

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

>>> lst = range(5)
>>> for i in lst:
...     lst.remove(i)
...     print i
... 
0
2
4
>>> lst
[1, 3]

发生的情况是,当您0从 list 中删除时[0, 1, 2, 3, 4],计数器会增加到 item 1,在现在更改的 list 中[1, 2, 3, 4]指向 value 22从列表中删除,迭代器计数递增到2更改后的列表中[1, 3, 4],这意味着循环中的下一个值是4,之后迭代器计数器计数超过结束并且循环终止。

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

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

如果您要删除一些项目,另一种选择是创建一个浅拷贝:

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

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

于 2013-05-31T00:16:59.480 回答
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 ]
于 2013-05-31T00:18:34.683 回答
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)]
于 2013-05-31T00:26:15.643 回答
0

如果您想在循环时修改列表,请见我的小朋友while 语句

numbers=range(1,20)
while numbers:
    if numbers[-1] % 2:
        print "If statement", numbers.pop()
    else:
        print "Else statement", numbers.pop()
于 2013-05-31T00:53:37.090 回答