繁体   English   中英

初学者:为什么我会收到此错误:IndexError: list assignment index out of range

[英]Beginner: Why am I getting this error: IndexError: list assignment index out of range

我是 Python 的初学者,想制作一个脚本来从 basketball-reference.com 收集一些篮球统计数据,并根据特定统计数据对列表进行排序。 我知道当您尝试引用不存在该索引的列表中的索引时会抛出此错误。 但是我已经尝试创建一个完全空的列表和一个具有定义范围的列表,但我仍然收到该错误。

代码:

player_first_name = ["Luka", "Nikola", "Giannis", "Stephen", "Jayson"]
player_last_name = ["Doncic", "Jokic", "Antetokounmpo", "Curry", "Tatum"]
player = []

...一些与此无关的代码

for x in range(5):
    player[x] = player_first_name[x] + " " + player_last_name[x]

注意:如果我声明 player = []、player = list() 或 player = [] * 5,我会收到此错误,根据我在网上阅读的内容,所有这些都应该没问题。 我可以将此错误排除在 go 之外的唯一方法是,如果我实际上将值放入每个索引(例如 player = ["a", "b", "c", "d", "e"]

如前所述,我尝试将播放器列表声明为:

player = []
player = [] * 5
player = list()

所有这些情况都导致了错误。

player = []是一个空列表。 如果要为此列表分配值,则必须使用append或任何其他方法。 这种方法会给你错误:

for x in range(5):
    player[x] = player_first_name[x] + " " + player_last_name[x]

#IndexError: list assignment index out of range

你不能简单地做一个for loop并赋值,因为它是一个空列表。 正确的方法是:

for x in range(5):
    player.append(player_first_name[x] + " " + player_last_name[x])
print(player)


#['Luka Doncic', 'Nikola Jokic', 'Giannis Antetokounmpo', 'Stephen Curry', 'Jayson Tatum', 'Luka Doncic', 'Nikola Jokic', 'Giannis Antetokounmpo', 'Stephen Curry', 'Jayson Tatum']

https://replit.com/languages/python3上玩一下在线 python 解释器 - 您可以在本地进行此操作,但它可以方便地快速检查一些语法并准确了解它们的作用。

让我们一一探讨:

x = []
x[1]= 2
print(x[1])

结果是:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    x[1]= 2
IndexError: list assignment index out of range

这是有道理的——我们试图分配给一个不存在的索引。 list()会做同样的事情。 检查[]*5东西,我们看到:

print([]*5)输出[]

所以这是一回事。

print([1]*5)输出[1, 1, 1, 1, 1]

所以它看起来像一个列表乘以一个数字只是重复列表 - 重复一个空列表只是一个空列表。

x = []
x.append(1)
print(x)

但是,给我们想要的东西,所以这是一种方法。 就我个人而言,我会变得更复杂并做类似的事情:

x= list(map(lambda x : x * 2, range(5)))
print(x)

结果是:

[0,2,4,6,8]

由于我将在下面解释的原因。 在这里, map function 采用可以对项目和列表执行的 function 和列表,并通过将 function 应用于列表的每个元素来生成列表。 对于你的情况,那看起来像

players = list(map(lambda x : layer_first_name[x] + " " + player_last_name[x], range(5))

我这样做的原因是它是不可变的——值不会改变。 在这种情况下这并不重要,但这是一个需要养成的好习惯。 有一整套围绕它构建的编程范式,因为它们通常更容易分析(对人类和机器而言)。这样做很方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM