Консоль: индекс списка вне диапазона - PullRequest
1 голос
/ 04 марта 2020

Я знаю, что это довольно тупой вопрос, но почему индекс списка ошибок индекса выходит за пределы диапазона, когда я запускаю свой код?

def ilepar(liczba):
    out = 0
    lst = []
    for n in liczba:
        lst.append(int(n))
    for i in lst:
        if i == lst[i + 1]:
            out += 1
        else:
            pass

    return out


print(ilepar('123'))

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Во время вызова ilepar ('123') происходит следующее:

1) после первого для l oop, список lst построено как lst = [1,2,3] . Следовательно, lst представляет собой список из 3 элементов, и вы можете получить к ним доступ с помощью индексов 0-2 (lst [0] = 1, lst [1] = 2, lst [2] = 3)

2) в секунду для l oop, i принимает каждое из значений lst . Итак, на первой итерации i = 1 , затем вы сравниваете 1 с lst [1 + 1] , что нормально, поскольку 1 + 1 = 2 является допустимым индексом в lst. На второй итерации i = 2 и вы сравниваете ее с lst [2 + 1] , и это приводит к тому, что индекс выходит за пределы, поскольку 3 не является допустимым индексом в lst!

0 голосов
/ 04 марта 2020

ваш второй for l oop он обращается к индексу, превышающему длину вашего списка lst

, если вы хотите перебрать индекс lst, который вы можете использовать:

 for i in range(len(lst) -1):
    if lst[i] == lst[i + 1]:
        out += 1
0 голосов
/ 04 марта 2020

В этих двух строках:

for i in lst:
    if i == lst[i + 1]:

Вы используете i как для ссылки на элемент в списке, так и в качестве индекса. Это, к сожалению, неверно. for i in lst присваивает i каждому элементу в списке.

Даже если i был индексом, lst[i + 1] поднимет IndexError, когда вы достигнете конца списка, так как вы ' Попытайтесь проиндексировать элемент, длина которого превышает длину списка.


Существует несколько различных способов решения этой проблемы. Лучше всего было бы использовать enumerate() (https://docs.python.org/3/library/functions.html#enumerate), который дает вам и индекс, и элемент:

for index, item in enumerate(lst):
    if index + 1 < len(lst) and item = lst[index + 1]:
        ...

Вы также можете использовать zip() (https://docs.python.org/3/library/functions.html#zip) для получения пар элементов из того же списка, используя lst[1:] для получения «следующего» элемента:

for a, b in zip(lst, lst[1:]):
    if a == b:
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...