如何用python中的顺序替换列表中的所有项?

如何用python中的顺序替换列表中的所有项?,python,list,Python,List,让我们看看这个列表: L = [8,1,4,2] 我想用它们的顺序替换它的元素。 预期结果: [4,1,3,2] 以下脚本可以工作,但其双for循环确实不够有效: L_result = [] for i in L : order = 1 for j in L : if i > j : order += 1 L_result.append(order) 使用+: 输出 [4, 1, 3, 2] [4, 1, 3, 5,

让我们看看这个列表:

L = [8,1,4,2]
我想用它们的顺序替换它的元素。
预期结果:

[4,1,3,2]
以下脚本可以工作,但其双for循环确实不够有效:

L_result = []
for i in L :
    order = 1
    for j in L :
        if i > j :
            order += 1
    L_result.append(order)
使用+:

输出

[4, 1, 3, 2]
[4, 1, 3, 5, 2]
这种方法是
O(n log n)
,因为它正在对数组进行排序。如果
L
具有重复的值,则可以执行以下操作:

from collections import defaultdict, deque

L = [8, 1, 4, 8, 2]

positions = defaultdict(deque)
for i, e in enumerate(sorted(L), 1):
    positions[e].append(i)

result = [positions[e].popleft() for e in L]

print(result)
输出

[4, 1, 3, 2]
[4, 1, 3, 5, 2]

使用a的原因是为了使顺序稳定,前8个具有第一个位置,同时保持popleft操作
O(1)
,因此算法保持
O(n log n)

您可以从L创建一个排序列表,然后从该列表创建一个dict,列表项作为键,顺序作为值。然后创建一个新列表,其中通过查找dict,L中的每个列表项都被顺序替换。这假设L中没有两个项目。但是如果在
L
中重复一个值,则此操作无效。也就是说,OP的代码对重复项也不起作用,这是一个非常好的解决方案!