Python按顺序缩减列表

3

假设我有一个列表 [10, 5, 7],我想将其缩减为表示相对顺序的内容 [3, 1, 2]。我不知道如何在Python中进行转换。


1
这并不是真正的缩减;“reduce”的意思通常是你最终得到的值比开始时要少(事实上,通常从一个列表中只有1个)。 - Mark Reed
看看这个链接: https://dev59.com/t2gv5IYBdhLWcg3wMN-0研究一下字典和enumerate。 - crownedzero
@PatrickKostjens 真是一种令人讨厌的暴力方法,我从列表中的1迭代到最大值,然后在遇到订单时将其勾选,但它非常缓慢,可能不值得使用。 - user2175923
4个回答

6
假设列表中没有重复元素,请尝试以下操作:
lst = [10, 5, 7]
std = sorted(lst)

[std.index(e)+1 for e in lst]
=> [3, 1, 2]

1
这是O(n**2)的算法,因此根据OP的需求可能过于“蛮力”。 - roippi

1
start = [10, 5, 7]

排序它

step1 = sorted(start) #if you have duplicates, sorted(set(start)) to uniquify

制作一个查找表。
lookup = {v:i for i,v in enumerate(step1,1)}

制作你的新列表。
[lookup[x] for x in start]
Out[9]: [3, 1, 2]

这是一个O(nlogn)的解决方案,而不是使用重复的index搜索的O(n**2)解决方案。时间记录:
test = [randrange(0,10000) for _ in range(10000)]

def f():
    std = sorted(test)
    return [std.index(e)+1 for e in test]

def g():
    step1 = sorted(test)
    lookup = {v:i for i,v in enumerate(step1,1)}
    return [lookup[x] for x in test]

%timeit f()
1 loops, best of 3: 1.17 s per loop

%timeit g()
100 loops, best of 3: 6.58 ms per loop

此答案假设输入列表包含唯一值。 - Simeon Visser
@SimeonVisser 是的。已经添加了一条注释来解决这个问题。 - roippi

0
a = [10,5,7]
b = sorted(a)
newList = []
for i in a:
  newList.append(b.index(i))

print newList

请注意,输出结果为[2,0,1],因为列表是从零开始的,如果需要,您可以修改代码以附加b.index(i)+1。

0
In [29]: L=[10,5,7]

In [30]: %paste
inds = {}
for v,k in enumerate(sorted(L),1):
  if k not in inds:
    inds[k] = []
  inds[k].append(v)
answer = [inds[k].pop() for k in L]

## -- End pasted text --

In [31]: answer
Out[31]: [3, 1, 2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接