我不确定为什么会收到以下错误:
builtins.IndexError: list index out of range
在以下行(第5行):
C[A[key(a)]] == C[A[key(a)]] + 1
此代码的输入示例为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
答案 0 :(得分:0)
您正在尝试将key(a)
视为列表A
的索引。 a
和key(a)
都不是[0, len(A)]
范围内的有效索引。
如果您想计算key(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]
来完成循环。
答案 1 :(得分:0)
原因是您使用超出列表A范围的索引访问列表A = [2,-2,1]。
对于第一个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