python:列表分配索引超出范围[sieve of erathostenes]

python:列表分配索引超出范围[sieve of erathostenes],python,Python,我有一个从main方法调用的类,该方法通过实现esteeofestenes来查找列表中的所有素数。然而在这条线上 nums[j] = 0 我得到了上面提到的错误: 列表分配索引超出范围 这是我的代码: class Prime: def is_prime(self, num): chk = False for i in range(2,num): if num % i == 0: chk = True return chk de

我有一个从main方法调用的类,该方法通过实现esteeofestenes来查找列表中的所有素数。然而在这条线上

nums[j] = 0
我得到了上面提到的错误:

列表分配索引超出范围

这是我的代码:

class Prime:

def is_prime(self, num):
    chk = False
    for i in range(2,num):
        if num % i == 0:
            chk = True
    return chk

def sieve_of_erathos(self, num):
    nums = []
    for i in range(2, num):
        nums.append(i)
    for i in range(2, num):
        if i != 0:
            for j in range(i+1, num):
                if j % i == 0:
                    nums[j] = 0
    primes = []
    for i in range (2, num):
        if nums[i] != 0:
            primes.append(nums[i])
    return primes

问题是数组中填充了range(2,num)

这将在数组中创建num-2个空格,这意味着您只能调用
nums[num-3]

您调用
nums[num-1]
所以使用

for i in range(2, num+2):
        nums.append(i)

相反。然后一切都应该正常

这是范围内j的问题(i+1,num):我猜你的
是素数
不正确,它返回
True
用于
12
,我认为您的chk默认值必须为True`并且您应该
False
在循环中使用它,然后使用
break
that@Arman然后,主函数处理布尔输出,并相应地完成输出。在12的情况下,输出是它不是素数。在这种情况下,您应该将它重命名为
is_NOT_prime
(或其他)以减少混淆。顺便说一句,
如果我!=0:
是冗余的,因为
2
for i in range(2, num+2):
        nums.append(i)