python "IndexError: индекс 8 выходит за пределы оси 0 с размером 8" - PullRequest
1 голос
/ 08 марта 2019

Проблема требует, чтобы я написал функцию, которая составляет список простых чисел из выходных данных данной функции, которая дает 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

1 Ответ

1 голос
/ 08 марта 2019

Ваш 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]

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

...