我试图弄清楚为什么这两个片段基本上应该做相同的工作,但不知何故它们没有。在
我想找出1-100之间的质数。我知道这是可行的:
# This create an empty list first.
# if number qualifies the prime number then append, if not then break.
pnumber1 = []
for x in range(2, 101):
for i in range(2, x):
if x % i == 0:
break
else:
pnumber1.append(x)
print(pnumber1)
所以我试着用另一种方式来玩,我创建一个所有数字1-100的列表,然后去掉不是质数的数字。剩下的应该是质数表。所以我有:
^{pr2}$不知何故,这不起作用,因为它将返回3-100之间的每个数字。这意味着pumber1b.remove(x)
不起作用。在
好吧,如果我这样做:
pnumber1b = list(range(3, 101))
for x in pnumber1b:
for i in range(2, x):
if x % i == 0:
pnumber1b.remove(x)
else:
break
print(pnumber1b)
要更改缩进级别,它仍将返回:list.remove(x): x not in list
@ddor254时
你的第一组代码不对,它只会删除偶数。在
我把它改成:
现在这就行了
有一些不清楚的行为使你的第一个代码工作,而第二个代码却没有发生。在
如果一个
for
循环能够在没有break
的情况下自然完成,则执行else
语句。在上面印着“好的!”公司名称:
但这不能:
^{pr2}$如果你像以前那样做:
然后它将自然到达
for i in range(2, x):
的末尾,将触发else
并跳出外循环,而不检查大多数值。在您可以删除
else
:这将失败,因为对于具有多个倍数的数字,它将尝试删除该项两次,并在找不到已删除的项时引发异常。在
在找到第一个倍数后,可以添加一个中断以停止查找倍数:
除了在迭代列表时删除列表项会导致迭代出现问题外,会起作用。您将看到它将开始只删除偶数。在
有效的方法是创建一个新列表,将非素数添加到该列表中,然后在迭代列表后,删除它们:
当然它行不通:以i=2,x=6为例,6不是素数,如果你去掉它。在
在i,i=3的下一次迭代中,您再次遇到x=6,并再次尝试删除它!所以你得到了一个错误:列表.删除(x) :x不在列表中。在
当然还有最重要的一点:你不能改变你正在迭代的列表!当您从列表中删除项x时,您的下一次迭代将无效,列表将被破坏!
如果询问x是否仍在pnumber1b中,请尝试添加其他内容:
或者只需在remove命令后添加break,因为不需要在数字x上继续运行
^{pr2}$相关问题 更多 >
编程相关推荐