Почему я получаю сообщение об ошибке «индекс списка вне допустимого диапазона»? - PullRequest
0 голосов
/ 07 мая 2020

Я написал программу, которая должна распечатать все составные числа от 0 до 100, но я продолжаю получать ошибку «индекс списка вне допустимого диапазона»

Что я могу сделать, чтобы исправить это?

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)

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Потому что вы редактируете список, просматривая его. При индексе 74 этот индекс больше не существует, потому что длина списка равна 73. Обратите внимание, что ваша основная функция, похоже, не работает так, как вы предполагали.

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)

Правильный вывод:

[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]
0 голосов
/ 07 мая 2020

Потому что вы удаляете элемент, если ваше условие истинно, но все равно увеличивается i. Измените свой код на следующий:

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)

Кстати, ваш код содержал ошибку if isPrime(num[i]==True), которую я изменил.

Вывод:

[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]

Как ваш isPrime алгоритм тоже не верный, я исправил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...