我有两个列表,一个参考和一个输入列表
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]
答案 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是Input
和Ref
的长度。 @rusu_ro1's solution使用类似的方法,但看起来是O(n + m)。