Python素数lis

2024-10-01 11:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚为什么这两个片段基本上应该做相同的工作,但不知何故它们没有。在

我想找出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


Tags: innumberforifnotrange数字remove
3条回答

@ddor254时

你的第一组代码不对,它只会删除偶数。在

我把它改成:

pnumber1b = list(range(2, 101))
pnumber1a = list(range(2, 101))
for x in pnumber1b:
    for i in range(2, x):
        if x % i == 0:
            if x in pnumber1a:
                pnumber1a.remove(x)
    else:
        continue
print(pnumber1a)

现在这就行了

有一些不清楚的行为使你的第一个代码工作,而第二个代码却没有发生。在

如果一个for循环能够在没有break的情况下自然完成,则执行else语句。在

上面印着“好的!”公司名称:

for i in range(10):
    if i == 11: break  # Condition not reached, loop ends naturally
else:
    print('Ok!')

但这不能:

^{pr2}$

如果你像以前那样做:

pnumber1b = list(range(3, 101))
for x in pnumber1b:
    for i in range(2, x):
        if x % i == 0:
            pnumber1b.remove(x)
    else:
        break

然后它将自然到达for i in range(2, x):的末尾,将触发else并跳出外循环,而不检查大多数值。在

您可以删除else

pnumber1b = list(range(3, 101))
for x in pnumber1b:
    for i in range(2, x):
        if x % i == 0:
            pnumber1b.remove(x)
print(pnumber1b)

这将失败,因为对于具有多个倍数的数字,它将尝试删除该项两次,并在找不到已删除的项时引发异常。在

在找到第一个倍数后,可以添加一个中断以停止查找倍数:

pnumber1b = list(range(3, 101))
for x in pnumber1b:
    for i in range(2, x):
        if x % i == 0:
            pnumber1b.remove(x)
            break
print(pnumber1b)

除了在迭代列表时删除列表项会导致迭代出现问题外,会起作用。您将看到它将开始只删除偶数。在

有效的方法是创建一个新列表,将非素数添加到该列表中,然后在迭代列表后,删除它们:

to_remove = []
pnumber1b = list(range(3, 101))
for x in pnumber1b:
    for i in range(2, x):
        if x % i == 0:
            to_remove.append(x)
            break
for r in to_remove:
    pnumber1b.remove(r)
print(pnumber1b)

当然它行不通:以i=2,x=6为例,6不是素数,如果你去掉它。在

在i,i=3的下一次迭代中,您再次遇到x=6,并再次尝试删除它!所以你得到了一个错误:列表.删除(x) :x不在列表中。在

当然还有最重要的一点:你不能改变你正在迭代的列表!当您从列表中删除项x时,您的下一次迭代将无效,列表将被破坏!

如果询问x是否仍在pnumber1b中,请尝试添加其他内容:

pnumber1b = list(range(3, 101))
pnumber1a = list(range(3, 101))
for x in pnumber1b:
        for i in range(2, x):
                if x % i == 0:
                    if x in pnumber1a:
                        pnumber1a.remove(x)
                        break
                    else:
                        continue

print(pnumber1a)

或者只需在remove命令后添加break,因为不需要在数字x上继续运行

^{pr2}$

相关问题 更多 >