Python 为什么我得到的列表索引超出范围错误?
我不确定为什么会出现以下错误:Python 为什么我得到的列表索引超出范围错误?,python,Python,我不确定为什么会出现以下错误: builtins.IndexError: list index out of range 在下一行(第5行): 该代码的输入示例是A=[2,-2,1]和key=lambda x:x**2,在第4-5行的循环中,它将A[A]处的项的键作为数组C的选定索引,并将该索引处的值增加1。例如:C[A[key(0)]],或C[4],是0,并递增为1 def key_positions(A, key): k = key(max(A, key = key))
builtins.IndexError: list index out of range
在下一行(第5行):
该代码的输入示例是A=[2,-2,1]
和key=lambda x:x**2
,在第4-5行的循环中,它将A[A]
处的项的键作为数组C
的选定索引,并将该索引处的值增加1
。例如:C[A[key(0)]]
,或C[4]
,是0
,并递增为1
def key_positions(A, key):
k = key(max(A, key = key))
C = [0] * (k+1)
for a in A:
C[A[key(a)]] == C[A[key(a)]] + 1
for i in range(0, k):
sum = C[i]
return C
您试图将
键(a)
视为列表a
的索引。a
和键(a)
都不是范围[0,len(a)]
中的有效索引
如果要计算键(a)
的出现次数,只需将其直接用作C
的索引即可:
def key_positions(A, key):
k = key(max(A, key = key))
C = [0] * (k+1)
for a in A:
C[key(a)] += 1
for i in range(0, k):
sum = C[i]
return C
我在这里使用了+=
增广赋值,而不是更详细的C[key(a)]=C[key(a)]+1
;这样可以避免每次重新执行key()
函数
使用以下方法计算最大k
值也更简单:
k = max(key(a) for a in A)
其次,你的sum=C[i]循环也是毫无意义的;循环是多余的,因为您从未使用过
sum
,并且您可以使用sum=C[-1]
来完成所有循环所做的事情。您试图将键(a)
作为列表a
的索引。a
和键(a)
都不是范围[0,len(a)]
中的有效索引
如果要计算键(a)
的出现次数,只需将其直接用作C
的索引即可:
def key_positions(A, key):
k = key(max(A, key = key))
C = [0] * (k+1)
for a in A:
C[key(a)] += 1
for i in range(0, k):
sum = C[i]
return C
我在这里使用了+=
增广赋值,而不是更详细的C[key(a)]=C[key(a)]+1
;这样可以避免每次重新执行key()
函数
使用以下方法计算最大k
值也更简单:
k = max(key(a) for a in A)
其次,你的sum=C[i]循环也是毫无意义的;循环是冗余的,因为您从未使用过
sum
,并且您可以使用sum=C[-1]
来完成所有循环所做的事情。原因是您访问列表A=[2,-2,1]时的索引超出了列表A的范围
对于第一个For循环的每次迭代,
计算a的平方(通过键lamba),这会导致索引错误
您必须确保访问列表A时,索引值不会大于列表A的大小
例如:
for a in A:
# key(a) will be 4, 4, 1
# but for key(2) it will be 4
# and larger than the list A.
C[A[key(a)]] == C[A[key(a)]] + 1
原因是访问列表A=[2,-2,1]时索引超出了列表A的范围 对于第一个For循环的每次迭代, 计算a的平方(通过键lamba),这会导致索引错误 您必须确保访问列表A时,索引值不会大于列表A的大小 例如:
for a in A:
# key(a) will be 4, 4, 1
# but for key(2) it will be 4
# and larger than the list A.
C[A[key(a)]] == C[A[key(a)]] + 1
更重要的是,那条线应该做什么?您正在进行比较,但没有指定结果。你的意思是分配(
=
,而不是=
)?即使只是=,我也会得到同样的错误;键错误发生在比较或赋值之前。但是想想A==[2,-2,1]
的情况,当A==2
时。什么是A[4]
?把你的例子写在纸上或者用例如单步进行。为什么A[key(A)]
a
是a
中的一个值,不是索引<代码>键(a)将进一步超出范围,因为x**2
也不是索引。更重要的是,这一行应该做什么?您正在进行比较,但没有指定结果。你的意思是分配(=
,而不是=
)?即使只是=,我也会得到同样的错误;键错误发生在比较或赋值之前。但是想想A==[2,-2,1]
的情况,当A==2
时。什么是A[4]
?把你的例子写在纸上或者用例如单步进行。为什么A[key(A)]
a
是a
中的一个值,不是索引<代码>键(a)将进一步超出范围,因为x**2
也不是索引。