次のようなリストがあります。
mylist1 = ['alpha', 'green']
mylist2 = ['blue', 'alpha', 'red']
これらの 2 つのリストを、このカスタム順序付きリストで並べ替えます。['red','blue','green','alpha']
そのようmylist1 = ['green', 'alpha']
にmylist2 = ['red','blue','alpha']
Pythonでこれを行うにはどうすればよいですか?
デモンストレーション:
>>> mylist1 = ['alpha', 'green']
>>> mylist2 = ['blue', 'alpha', 'red']
>>> sort_order = ['red', 'blue', 'green', 'alpha']
>>> mylist1.sort(key=sort_order.index)
>>> mylist1
['green', 'alpha']
>>> mylist2.sort(key=sort_order.index)
>>> mylist2
['red', 'blue', 'alpha']
説明:
のkey
パラメータにより、リストは の代わりにlist.sort
比較して順序を決定します。たとえば、大文字と小文字を区別しない並べ替えを行うには、文字列を小文字にする関数を渡すことができます。小文字の要素が比較されますが、元の要素は保持されます。key(element)
element
key
>>> x = ["age", "Bonkers", "cheese"]
>>> x.sort()
>>> x
['Bonkers', 'age', 'cheese']
>>> str.lower("Bonkers")
'bonkers'
>>> x.sort(key=str.lower)
>>> x
['age', 'Bonkers', 'cheese']
キーに使用すると、要素自体ではなく、要素がリストsort_order.index
内に持つインデックスを使用して順序が決定されます。sort_order
したがって、 'red'
uses 0
、'blue'
uses1
など...結果として、並べ替えられるリストは、各要素がどこにあるかに従って並べ替えられsort_order
ます。
インデックスをキーとして使用します。
key=lambda x: customlist.index(x)
あなたが使用することができます:
>>> a = ['red','blue','green','alpha']
>>> b = ['alpha', 'green']
>>> filter(set(b).__contains__, a)
['green', 'alpha']
a
リストを順番にソートする代わりに、ソースリストに存在するすでに順序付けされたリストの要素のみを含めますb
。
必要に応じて、それをとして記述し[el for el in a if el in b]
、オプションb
でセットとして持つことができます。
もちろん、本当にやりたいのであれば、 ( を発行し続けることによって)sort
リストを複数回反復する可能性があるのではなく、おそらくインデックス ルックアップを作成する必要があります。.index
order = {v:i for i,v in enumerate(a)}
b.sort(key=order.get)