控制台:列表索引超出范围
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 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:]
获取 "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
我知道这是一个有点愚蠢的问题,但为什么当我 运行 我的代码时出现索引错误列表索引超出范围?
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 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:]
获取 "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