如何根据另一个列表对一个列表进行排序?

Har*_*pta 26 python sorting algorithm

我有两个列表,一个参考和一个输入列表

Ref = [3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4]
Input = [9, 5, 2, 3, 10, 4, 11, 8]
Run Code Online (Sandbox Code Playgroud)

我想按照 Ref 的顺序对输入列表进行排序。如果输入列表中缺少某个元素,它可以跳过并转到另一个元素。

因此排序的输入列表,基于参考列表将是这样的

Sorted_Input = [3, 2, 11, 10, 9, 8, 5, 4]
Run Code Online (Sandbox Code Playgroud)

dcg*_*dcg 24

我认为这回答了你的问题:

>>> [x for x in Ref if x in Input]
>>> [3, 2, 11, 10, 9, 8, 5, 4]
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

更新:制作Input一个set更快的访问:

>>> Input_Set = set(Input)
>>> [x for x in Ref if x in Input_Set]
[3, 2, 11, 10, 9, 8, 5, 4]
Run Code Online (Sandbox Code Playgroud)

  • 这对于提问者来说可能并不重要,因为他们接受了答案,但要注意这会删除“Input”的重复数据并对它进行排序。例如,“[1, 1, 1, 3]”将转到“[3, 1]”。 (3认同)

A. *_*kal 8

除了 dcg 的答案之外的另一种方法如下:

Ref = [3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4]
Input = [9, 5, 2, 3, 10, 4, 11, 8]

ref = set(Ref)
inp = set(Input)

sorted_list = sorted(ref.intersection(inp), key = Ref.index)
Run Code Online (Sandbox Code Playgroud)

这输出到:

[3, 2, 11, 10, 9, 8, 5, 4]
Run Code Online (Sandbox Code Playgroud)

在这里,您将列表转换为集合,找到它们的交集,然后对它们进行排序。该集合根据“Ref”列表的索引进行排序。


rus*_*ro1 8

您可以使用排序方法:

# keep in a dict the index for each value from Ref
ref  = {val: i for i, val in enumerate(Ref)}
# sort by the index value from Ref for each number from Input 
sorted(Input, key=ref.get)
Run Code Online (Sandbox Code Playgroud)

输出:

[3, 2, 11, 10, 9, 8, 5, 4]
Run Code Online (Sandbox Code Playgroud)


wja*_*rea 6

这是天真的方法:

sorted(Input, key=Ref.index)
Run Code Online (Sandbox Code Playgroud)

或就地:

Input.sort(key=Ref.index)
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,它都只是一行。

虽然我认为这是缓慢的-为O(n * m),其中n和m的长度InputRef@rusu_ro1 的解决方案使用了类似的方法,但似乎是 O(n+m)。

  • 从技术上讲,我认为任何其他解决方案都是过早优化,除非我们知道输入足够大以至于速度很重要。 (2认同)
  • @JollyJoker并且不知道真实列表中的元素类型(重复/唯一元素,可散列或不可散列等)。 (2认同)