我制作了一个简单的代码:
arr = [4, 9, 5, 3, 2, 10]
kpmp = [] # Empty list to store the comparison
for i in arr:
if i>0:
x = 0
j = i
while j>=0:
j-=1
if arr[i] > arr[j]:
x+=1
kpmp.append(x)
print(kpmp)
但是,我收到了这个错误:
Traceback (most recent call last):
File "python", line 11, in <module>
IndexError: list index out of range
这一行是if arr[i] > arr[j]:
我想要打印的预期输出是列表[0, 0, 1, 3, 4, 0]
说明:
arr = [4, 9, 5, 3, 2, 10]
1. 4无可比拟,结果为0
2. 9> 4结果为0
3. 4&lt; 5&lt; 9结果是1
4. 3&lt; 4&lt; 5&lt; 9结果是3
5. 2&lt; 3&lt; 4&lt; 5&lt; 9结果是4
嗯,10是列表中最大的,所以结果是0
我被困在这里,虽然有点基本的Python知识 谢谢你的帮助!
答案 0 :(得分:4)
您当前正在使用列表元素作为索引,如果它们大于列表的长度,则会导致超出范围错误。
由于arr
包含9
,因此会抛出超出范围的错误。此外,您需要在x
声明之前定义if
,否则您将收到variable not found
错误。
以下是使用列表推导和 slicing
解决问题的不同方法:
x = [4, 9, 5, 3, 2, 10]
final = [sum(k > j for k in x[:i]) for i, j in enumerate(x)]
# [0, 0, 1, 3, 4, 0]
说明:
sum(k > j for k in x[:i])
这将计算大于当前值的所有先前值。 x[:i]
获取列表中当前元素之前的所有元素。
答案 1 :(得分:2)
看起来您正在尝试使用i
和j
作为索引,但它们将成为列表本身的元素。如果你想使用索引,你有几个选择:
for i in range(len(arr)):
或
for i, _ in enumerate(arr):
如果您尝试在原始代码中打印i
arr = [4, 9, 5, 3, 2, 10]
for i in arr:
print(i)
这将打印列表中的所有元素,每个元素都在各自的行上
4
9
5
3
2
10
答案 2 :(得分:2)
用于修复上述代码:
j
递减声明。您可以尝试如下:
arr = [4, 9, 5, 3, 2, 10]
kpmp = [] # Empty list to store the comparison
# iterate through length of arr
for i in range(len(arr)):
if i>0:
x = 0
j = i
while j>=0:
if arr[i] < arr[j]:
x+=1
j-=1 # decrease j after comparison rather than before
kpmp.append(x)
print(kpmp)
结果:
[0, 0, 1, 3, 4, 0]
您也可以尝试使用list comprehension
,如下所示:
kmpp = [sum(arr[i] < arr[j] for j in range(i)) for i in range(len(arr))]
答案 3 :(得分:1)
您的代码中存在错误
for i in arr:
print(i) # will print 4 9 5 3 2 10
这会将每个元素都放在arr。
中因此,当数组大小为6时,arr [9]将抛出错误。