Python IndexError: индекс списка вне диапазона при использовании списка в качестве итерируемого - PullRequest
0 голосов
/ 29 ноября 2018

Вот код:

import math as m
primeproduct = 5397346292805549782720214077673687806275517530364350655459511599582614290
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181]

def pseudoroot(n):
print(n)
for i in n:
    if n[i] > m.sqrt(primeproduct):
        return n[i-1] #greatest divisor below the root


psrprime = pseudoroot(primes)

Запуск этого кода приводит к этой ошибке:

Traceback (most recent call last):
  File "so.py", line 11, in <module>
    print(pseudoroot(primes))
  File "so.py", line 7, in pseudoroot
    if n[i] > m.sqrt(primeproduct):
IndexError: list index out of range

Что на самом деле не имеет никакого смысла для меня, поскольку я в цикле forявляется указанным индексом в списке и не должен выходить за пределы этого списка.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Вы перепутали список index со списком содержимое .for i in n означает, что i будет принимать значения n в последовательности: 2, 3, 5, 7, 11, ...

С точки зрения Python ... nимеет 42 элемента.Как только вы получаете доступ к n[i], когда мне 43, вы терпите крах.

Попробуйте это:

def pseudoroot(n):
    for i, p in enumerate(n):
        if p > m.sqrt(primeproduct):
            return n[i-1] #greatest divisor below the root

Обратите внимание, что это не получается в MCVE, потому что вы недостаточно простых чисел, чтобы добраться до sqrt (primeproduct).

0 голосов
/ 29 ноября 2018

Что на самом деле не имеет никакого смысла для меня, так как i в цикле for является заданным индексом в списке и не должен выходить за границы этого списка.

Не совсем.i это элемент в вашем списке, не индекс.

for i in n дает вам элементов в n.Не указатель.Так что делать n[i] немного бессмысленно (вы используете items в качестве индексов).Быстрое решение состоит в том, чтобы использовать for i in range(len(n)), если вы хотите индекс в стиле C.

Более Pythonic будет:

for before_prime, current_prime in zip(n, n[1:]):
    if current_prime > m.sqrt(primeprod):
        return before_prime #greatest divisor below the root
0 голосов
/ 29 ноября 2018

for i in n перебирает значения , а не показатели.Если вы хотите указать, есть несколько способов сделать это, например, for i, v in enumerate(n), а затем вы можете использовать v вместо n[i].

...