次の方法でこれを行うことができるはずだと思います:
paired_sorted = sorted(zip(List2,List3,List1),key = lambda x: (x[0],-x[1]))
l2,l3,l1 = zip(*paired_sorted)
実際に:
>>> List1 = ['a', 'b', 'c', 'd', 'e']
>>> List2 = [4, 2, 3, 2, 4]
>>> List3 = [0.1, 0.8, 0.3, 0.6, 0.4]
>>> paired_sorted = sorted(zip(List2,List3,List1),key = lambda x: (x[0],-x[1]))
>>> l2,l3,l1 = zip(*paired_sorted)
>>> print l1
('b', 'd', 'c', 'e', 'a')
仕組みは次のとおりです。まず、 を使用して、リストから対応する要素を照合しますzip
。次に、最初に List2 の項目、2 番目に (否定された) List3 の項目に基づいて、これらの要素を並べ替えます。次に、引数のアンパッキングを使用して List1 要素を再度取り出す必要がありzip
ますが、1 日の終わりにタプルの代わりにリストがあることを確認したい場合は、リスト内包表記を使用して簡単に行うことができます。
List3 の値を簡単に否定できない場合 (たとえば、文字列の場合)、これは少し難しくなります。2 つのパスで並べ替えを行う必要があります。
paired = zip(List2,List3,List1)
rev_sorted = sorted(paired,reverse=True,key=lambda x: x[1]) #"minor" sort first
paired_sorted = sorted(rev_sorted,key=lambda x:x[0]) #"major" sort last
l2,l3,l1 = zip(*paired_sorted)
(必要に応じて、上記operator.itemgetter(1)
の代わりに使用できますlambda x:x[1]
)。これは、Python の並べ替えが「安定」しているため機能します。「等しい」要素を並べ替えることはありません。