python IndexError: индекс 8 выходит за пределы оси 0 с размером 8

Проблема требует, чтобы я написал функцию, которая составляет список простых чисел из вывода заданной функции, которая дает 2 списка, один список чисел от 2 до произвольного числа и второй список, который соответствует числам в первом списке с значения «истина» или «ложь» в зависимости от того, являются ли числа в первом списке простыми или нет.

Я понятия не имею, является ли мой код принципиально неправильным, чтобы ответить на вопрос, или я на правильном пути и только что сделал ошибку...

Любая помощь будет очень признательна.

Вопрос:

Напишите функцию (назовем ее primes_list), которая принимает один вход N. Эта функция должна использовать функцию prime_sieve для вычисления и возврата массива (или списка) только простых чисел, меньших или равных N+1.

Например, если N=8, эта функция должна вернуть [2,3,5,7]

данный код:

import numpy as np

def prime_sieve(N):
    nums = np.arange(2, N+2, 1)
    mask = []
    for n in nums:
        mask.append(True)
    for n in nums:     
        for i in np.arange(2*n-2, N, n):
            mask[i] = False
    return nums, np.array(mask)

numbers, mask = prime_sieve(8)
print(numbers)
print(mask)

[2 3 4 5 6 7 8 9]
[ True  True False  True False  True False False]

Мой код:

import numpy as np

def primes_list(N):
    numbers, mask = prime_sieve(N)
    primes = []
    for n in numbers:
        if mask[n] == "true":
            primes.append(numbers[n])
    return primes

print(primes_list(8))

но это дает ошибку:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
 <ipython-input-60-4ea4d2f36734> in <module>
----> 2 print(primes_list(8))

<ipython-input-59-a5080837c5c8> in primes_list(N)
      6     primes = []
      7     for n in numbers:
----> 8         if mask[n] == "true":
      9             primes.append(numbers[n])
     10     return primes

IndexError: index 8 is out of bounds for axis 0 with size 8

person DJBlom    schedule 08.03.2019    source источник


Ответы (1)


Ваш n, который вы используете для нарезки вашего списка mask, представляет собой список чисел, которые не подходят для индекса (поскольку он всегда будет содержать N, N+1, а последний индекс mask равен N-1).

Кроме того, второй список mask содержит Bool, а не str, поэтому ваше сравнение mask[n] == 'true' всегда возвращает False.

Учитывая вышеизложенное, ваш primes_list может быть:

def primes_list(N):
    numbers, mask = prime_sieve(N)
    primes = []
    for i, n in enumerate(numbers): # <<< added enumerate 
        if mask[i]:                 # <<< removed unnecessary comparison
            primes.append(n)        # <<< append n directly
    return primes

который возвращает:

[2, 3, 5, 7]

как и должно быть.

person Chris    schedule 08.03.2019