web-dev-qa-db-ja.com

リストを別のリストに基づいてソートする方法は?

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]
24
Hardik Gupta

これはあなたの質問に答えると思います:

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

それが役に立てば幸い。

[〜#〜] update [〜#〜]Inputsetにして、アクセスを高速化します。

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

並べ替え方法を使用できます。

# 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]
7
kederrac

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」リストのインデックスに基づいてソートされます。

7
A. Dhakal

これは素朴なアプローチです:

sorted(Input, key=Ref.index)

またはインプレース:

Input.sort(key=Ref.index)

どちらの方法でも、1行だけです。

遅いと思いますが-O(n * m)ここで、nとmはInputRefの長さです。 @ rusu_ro1の解 は同様の方法を使用しますが、O(n + m)のようです。

6
wjandrea