Почему это выходит за пределы диапазона? - PullRequest
0 голосов
/ 28 сентября 2018

Я получаю IndexError: ошибка индекса списка вне диапазона.Я не уверен почему.Любой совет?

Код пытается увидеть, является ли список чисел арифметической прогрессией, в этом случае каждое число добавляется на 2.

def is_arith_progession(num_list):

    delta = num_list[1] - num_list[0]
    for num in num_list:
        if not (num_list[num + 1] - num_list[num] == delta):
        return False
    else:
        return True

print(is_arith_progession([2, 4, 6, 8, 10]))

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

2 вещи:

  • num - это элемент num_list, а не просто индекс.Получение индекса будет for num in range(len(num_list)):, вы фактически вызываете num_list[num_list[i]];
  • Даже если бы это был индекс, для последнего индекса num в массиве вы вызываете numlist [num + 1],который выходит за границы массива, так как num уже последний;

Do for INDEX in range(len(num_list)-1): и if not (num_list[INDEX + 1] - num_list[INDEX] == delta):.Это должно сделать это.

0 голосов
/ 28 сентября 2018

Вы перебираете значения , а не индексы массива.Таким образом, num_list[num] может быть вне диапазона.Поскольку вы ссылаетесь на элемент i+1, выполняйте итерацию до i < n-1

for i, _ in enumerate(num_list[:-1]):
    if num_list[i+1] - num_list[i]...
0 голосов
/ 28 сентября 2018

Это:

for num in num_list:
    if not (num_list[num + 1] - num_list[num] == delta):
        return False

почти наверняка не делает то, что вы думаете, что делает.Когда вы определяете for num in num_list:, это означает, что num является элементом из списка num_list.num НЕ является индексом.Таким образом, если ваш список [2, 4, 6, 8, 10], вы выходите за пределы, когда num равен 4 (т.е. второй элемент в вашем списке), потому что ваш входной список имеет длину только 5 и вы пытаетесь получить доступ к индексу num+15 (индексы основаны на 0, поэтому 5 выходит за границы)

Вы, вероятно, хотите что-то вроде этого:

# Start at index 1, or you'll always return false since delta == index1 - index0
for index in range(1, len(num_list)-1):
    if not (num_list[num + 1] - num_list[num] == delta):
        return False

или более питонический (обратите внимание, тамнет индексов):

# Again start at index1, zip will handle the edge case of ending nicely so we don't go OB
for num, next_num in zip(num_list[1:], num_list[2:]):
    if not (next_num - num == delta):
        return False
0 голосов
/ 28 сентября 2018

Вы пытаетесь получить доступ к 5-му элементу массива num_list во второй итерации цикла for.После первой итерации num становится равным 4, поэтому программа вылетает, когда пытается оценить num_list[num + 1].

num. Переменная содержит фактический элемент в списке.Это не индекс для элемента.

Чтобы перебрать индексы, вы можете попробовать for num in range(len(num_list) - 1), который должен решить проблему.(Примечание -1 в парантезе)

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