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)
除了 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”列表的索引进行排序。
您可以使用排序方法:
# 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)
这是天真的方法:
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的长度Input和Ref。@rusu_ro1 的解决方案使用了类似的方法,但似乎是 O(n+m)。