Python 循环中的if语句不工作
就我的一生而言,我不明白为什么我的IF语句没有被击中。在很多情况下,结果列表中最后一个数字的剩余部分n//为0Python 循环中的if语句不工作,python,Python,就我的一生而言,我不明白为什么我的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.r
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)
问题是您在对列表进行迭代时正在修改它,所以所有偶数都被跳过。因此,if条件始终为False for循环跟踪索引,因此当您删除索引i处的项目时,位于i+1位置的下一个项目将移动到当前索引xi,因此在下一次迭代中,您将实际拾取i+2项目 例如:
>>> lis = range(3,15)
>>> for x in lis:
... print x
... lis.remove(x)
...
3
5
7
9
11
13
问题是您在对列表进行迭代时正在修改它,所以所有偶数都被跳过。因此,if条件始终为False for循环跟踪索引,因此当您删除索引i处的项目时,位于i+1位置的下一个项目将移动到当前索引xi,因此在下一次迭代中,您将实际拾取i+2项目 例如:
>>> lis = range(3,15)
>>> for x in lis:
... print x
... lis.remove(x)
...
3
5
7
9
11
13
不要在要从中删除项目的列表上循环。for循环创建一个列表迭代器,该迭代器通过递增计数器来跟踪当前项。但缩小列表意味着计数器将在循环迭代之间指向错误的项:
>>> lst = range(5)
>>> for i in lst:
... lst.remove(i)
... print i
...
0
2
4
>>> lst
[1, 3]
当您从列表[0,1,2,3,4]中删除0时,计数器会增加到项目1,而现在更改的列表[1,2,3,4]中的项目1指向值2。从列表中删除2,迭代器计数将增加到2,在修改后的列表[1,3,4]中,这意味着循环中的下一个值是4,之后迭代器计数器的计数将超过结束,循环终止
如果要从列表中删除所有项目,请使用while循环:
while numbers:
n = numbers.pop()
# do something with `n`
如果要删除某些项目,另一个选项是创建浅层副本:
for n in numbers[:]:
# ....
现在,您可以根据自己的内容更改数字,因为for循环将在副本上迭代。不要在要从中删除项目的列表上循环。for循环创建一个列表迭代器,该迭代器通过递增计数器来跟踪当前项。但缩小列表意味着计数器将在循环迭代之间指向错误的项:
>>> lst = range(5)
>>> for i in lst:
... lst.remove(i)
... print i
...
0
2
4
>>> lst
[1, 3]
当您从列表[0,1,2,3,4]中删除0时,计数器会增加到项目1,而现在更改的列表[1,2,3,4]中的项目1指向值2。从列表中删除2,迭代器计数将增加到2,在修改后的列表[1,3,4]中,这意味着循环中的下一个值是4,之后迭代器计数器的计数将超过结束,循环终止
如果要从列表中删除所有项目,请使用while循环:
while numbers:
n = numbers.pop()
# do something with `n`
如果要删除某些项目,另一个选项是创建浅层副本:
for n in numbers[:]:
# ....
现在,您可以将数字更改为心形内容,因为for循环将在副本上迭代。列表修改的另一种方法是执行两个过程:
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 ]
列表修改的另一种方法是执行两个过程:
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 ]
正如其他人所回答的那样,问题在于您正在迭代的列表的修改。我认为你真正想做的事情可以这样做:
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)]
正如其他人所回答的那样,问题在于您正在迭代的列表的修改。我认为你真正想做的事情可以这样做:
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)]
如果您想在循环列表时修改列表,请与我的小朋友会面:
如果您想在循环列表时修改列表,请与我的小朋友会面:
尝试在for之后和if之后添加调试输出,例如,print n print results[-1]在迭代过程中从数字中删除项目。这将导致错误,因为迭代器计数器将递增,而您的循环将“跳过”项。调用list.remove会对列表产生副作用-这会导致什么异常?我会在不使用remove的情况下重写它-与remove相反的是保留那些应该保留的内容:D在两个分支中删除似乎也很奇怪=删除所有内容,但是..尝试在for之后和if之后添加调试输出,例如print n print results[-1]在对数字进行迭代时,您正在从数字中删除项目。这将导致错误,因为迭代器计数器将递增,而您的循环将“跳过”项。调用list.remove会对列表产生副作用-这会导致什么异常?我会在不使用remove的情况下重写这个,与remove相反的是保留那些应该保留的东西:D在两个分支中删除似乎也很奇怪=删除所有内容,但是..有一个内置的方法来做这件事似乎很有用。我曾多次需要类似的东西。有一个内置的方法似乎很有用。我需要这样的东西很多次。