[英]Why am I getting the error “list index out of range”?
I have written a program that should print out all the composite numbers from 0 to 100, but I keep getting the error "list index out of range"我编写了一个程序,应该打印出从 0 到 100 的所有合数,但我不断收到错误“列表索引超出范围”
What could I do to fix it?我能做些什么来解决它?
def isPrime(x):
if x==0:
return False
if x==1 or x==2:
return True
for i in range(2, x):
if x%i==0:
return False
break
elif x%i==1:
return True
else:
print("error")
i=0
num = list(range(100))
while i<100:
if isPrime(num[i]==True): #I get the error here
del (num[i])
i += 1
else:
i += 1
print(num)
Because you are deleting an element if your condition is true, but still increasing i
.因为如果您的条件为真,您将删除一个元素,但仍在增加i
。 Change your code to the following:将您的代码更改为以下内容:
def isPrime(x):
if x==0:
return False
if x==1 or x==2:
return True
for i in range(2, x):
if x%i==0:
return False
return True
i=0
lim = 100
num = list(range(lim))
while i<lim:
if isPrime(num[i])==True: #I get the error here
del (num[i])
lim -=1
else:
i += 1
print(num)
Btw, your code contained an error if isPrime(num[i]==True)
which I have changed.顺便说一句, if isPrime(num[i]==True)
,您的代码包含错误。
Output: Output:
[0, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64, 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 98, 99]
As your isPrime
algorithm wasn't correct, too, I have corrected it.由于您的isPrime
算法也不正确,因此我已对其进行了更正。
Because you're editing the list while you're looping over it.因为您在循环访问列表时正在编辑列表。 At index 74 this index does not exist anymore because the length of the list is 73. Note that your prime function does not seem to work as you intend it to.在索引 74 处,该索引不再存在,因为列表的长度为 73。请注意,您的素数 function 似乎无法按您的预期工作。
from math import sqrt
from itertools import count, islice
def isPrime(n): # Taken from https://stackoverflow.com/questions/4114167/checking-if-a-number-is-a-prime-number-in-python/27946768#27946768
if n < 2:
return False
for number in islice(count(2), int(sqrt(n) - 1)):
if n % number == 0:
return False
return True
num = list(range(100))
to_delete = []
for i in num:
if isPrime(i): #I get the error here
to_delete.append(i)
final = [n for n in num if n not in to_delete]
print(final)
Correct output:正确的 output:
[0, 1, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 38, 39, 40, 42, 44, 45, 46, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 60, 62, 63, 64, 65, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 90, 91, 92, 93, 94, 95, 96, 98, 99]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.