比较列表元素

时间:2018-05-18 03:46:41

标签: python python-3.x

我制作了一个简单的代码:

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知识 谢谢你的帮助!

4 个答案:

答案 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)

看起来您正在尝试使用ij作为索引,但它们将成为列表本身的元素。如果你想使用索引,你有几个选择:

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]将抛出错误。