控制台:列表索引超出范围

Console: List index out of range

我知道这是一个有点愚蠢的问题,但为什么当我 运行 我的代码时出现索引错误列表索引超出范围?

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'))

在这两行中:

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

您正在使用 i 来引用列表中的项目,并作为索引。不幸的是,这是不正确的。 for i in lsti 分配给列表中的每个元素。

即使 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:] 获取 "next" 元素:

for a, b in zip(lst, lst[1:]):
    if a == b:
        ...

在调用 ilepar('123') 期间,发生的情况是:

1) 在第一个 for 循环之后,列表 lst 被构建为 lst = [1,2,3]。因此,lst 是一个包含 3 个元素的列表,您可以使用索引 0-2 访问它们(lst[0]=1,lst[1]=2,lst[2]=3 )

2) 在你的第二个 for 循环中,i 获取 lst 的每个值。所以在第一次迭代中,i=1,然后你将 1 与 lst[1+1] 进行比较,这是可以的,因为 1+1=2是 lst 中的有效索引。在第二次迭代中,i=2 并将其与 lst[2+1] 进行比较,这会导致索引越界,因为 3 是不是 lst 中的有效索引!

您的第二个 for 循环正在访问一个大于列表长度的索引 lst

如果您想遍历 lst 索引,您可以使用:

 for i in range(len(lst) -1):
    if lst[i] == lst[i + 1]:
        out += 1