6

次のようなリストがあります。

mylist1 = ['alpha', 'green']
mylist2 = ['blue', 'alpha', 'red']

これらの 2 つのリストを、このカスタム順序付きリストで並べ替えます。['red','blue','green','alpha']

そのようmylist1 = ['green', 'alpha']mylist2 = ['red','blue','alpha']

Pythonでこれを行うにはどうすればよいですか?

4

3 に答える 3

13

デモンストレーション

>>> 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)elementkey

>>> 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ます。

于 2013-08-23T17:10:38.820 に答える
4

インデックスをキーとして使用します。

key=lambda x: customlist.index(x)
于 2013-08-23T17:10:18.413 に答える
2

あなたが使用することができます:

>>> 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)
于 2013-08-23T17:12:23.867 に答える