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
也不是索引。