【问题标题】:Console: List index out of range控制台:列表索引超出范围
【发布时间】:2020-06-17 06:35:06
【问题描述】:

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

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

【问题讨论】:

  • 您的错误在这里。 if i == lst[i + 1]:i 到达最后一个索引并且您添加了 1 时,它将超出列表的范围。它将打印 list index out of range
  • 为什么要使用列表的元素作为列表索引?这很少有道理。
  • 请分享整个错误信息。这段代码是做什么用的?

标签: python python-3.x list indexing int


【解决方案1】:

这两行:

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:] 获取“下一个”元素:

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

【讨论】:

    【解决方案2】:

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

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

    2) 在第二个 for 循环中,i 采用 lst 的每个值。所以在第一次迭代中,i=1,然后你将 1 与 lst[1+1] 进行比较,这没关系,因为 1+1=2 是 lst 中的有效索引.在第二次迭代中,i=2 并将其与 lst[2+1] 进行比较,这会导致索引超出范围,因为 3 不是 lst 中的有效索引!

    【讨论】:

      【解决方案3】:

      您的第二个 for 循环它正在访问一个索引,而不是您的列表长度 lst

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2011-06-14
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多