2つのリスト、1つの参照と1つの入力リストがあります
Ref = [3, 2, 1, 12, 11, 10, 9, 8, 7, 6, 5, 4]
Input = [9, 5, 2, 3, 10, 4, 11, 8]
入力リストを参考文献の順に並べたい。入力リストに欠落している要素がある場合、スキップして他の要素に移動できます。
したがって、Refリストに基づいてソートされた入力リストは次のようになります
Sorted_Input = [3, 2, 11, 10, 9, 8, 5, 4]
これはあなたの質問に答えると思います:
>>> [x for x in Ref if x in Input]
>>> [3, 2, 11, 10, 9, 8, 5, 4]
それが役に立てば幸い。
[〜#〜] update [〜#〜]:Input
をset
にして、アクセスを高速化します。
>>> Input_Set = set(Input)
>>> [x for x in Ref if x in Input_Set]
[3, 2, 11, 10, 9, 8, 5, 4]
並べ替え方法を使用できます。
# 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]
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]
ここでは、リストをセットに変換し、それらの共通部分を見つけて、並べ替えます。セットは、「Ref」リストのインデックスに基づいてソートされます。
これは素朴なアプローチです:
sorted(Input, key=Ref.index)
またはインプレース:
Input.sort(key=Ref.index)
どちらの方法でも、1行だけです。
遅いと思いますが-O(n * m)ここで、nとmはInput
とRef
の長さです。 @ rusu_ro1の解 は同様の方法を使用しますが、O(n + m)のようです。