根据另一个Python对一个列表进行排序

时间:2019-12-25 16:16:58

标签: python python-3.x algorithm list sorting

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

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

我想按“参考”的顺序对“输入”列表进行排序。如果“输入”列表中缺少某些元素,则可以跳过并查找其他元素。

因此,基于引用列表的已排序输入列表将是这样

Sorted_Input = [3, 2, 11, 10, 9, 8, 5, 4]

4 个答案:

答案 0 :(得分:16)

我认为这可以回答您的问题:

>>> [x for x in Ref if x in Input]
>>> [3, 2, 11, 10, 9, 8, 5, 4]

希望有帮助。

更新: 将Input设为set,以加快访问速度:

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

答案 1 :(得分:7)

您可以使用排序方法:

# 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)

输出:

[3, 2, 11, 10, 9, 8, 5, 4]

答案 2 :(得分:6)

除了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)

这输出到:

[3, 2, 11, 10, 9, 8, 5, 4]

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

答案 3 :(得分:5)

这是幼稚的方法:

sorted(Input, key=Ref.index)

或就地:

Input.sort(key=Ref.index)

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

尽管我认为它很慢-O(n * m),其中n和m是InputRef的长度。 @rusu_ro1's solution使用类似的方法,但看起来是O(n + m)。