2016-08-27 6 views
0

ソート場合で、Iのようなリストを有する:[(1、A)、(1、B)、(5、C)]Pythonはここでは、2つのキー二桁

I希望

をリストをソートして最初に番号を降順に、次に文字を昇順にソートします。

は、私が試した:

sorted(theList, key = lambda x:(x[0], x[1]), reverse = True) 

しかし、結果は、両方のキーに降順で順序付けされます。そして、明らかに、1つの変数を取り戻すだけです。 ウェブを検索して解決策を見つけることができませんでした。助けてください!ありがとうございました!

+6

このようなものをお探しですか? http://stackoverflow.com/questions/3979872/python-how-to-sort-a-complex-list-on-two-different-keys – idjaw

答えて

3

タプルの最初の要素が整数である場合は、並べ替えることができますその負の値によって:

sorted(theList, key=lambda (num, letter): (-num, letter)) 
3

はPythonドキュメントによると:

内蔵のソート()関数は安定であることが保証されます。ソートは、同等の要素の相対的な順序を変更しないことが保証されていれば安定しています。これは、複数回のソート(部門別ソート、給与グレードなど)に役立ちます。

ので、それを行うための簡単な方法は、ソート2パスをやってます。

sorted(theList, key = lambda x:x[1]) 
sorted(theList, key = lambda x:x[0], reverse = True) 

それとも、本当にワンライナーをしたい場合、あなたはこれを行うことができます:

sorted(thisList, key = lambda x:x[0] * 26 - (ord(x[1]) - ord('a')), reverse = True) 

この1つのライナーは、すべての文字が小文字であることを前提としています。それは、2つの連続する数字のそれぞれが1ではなく26のステップを持ち、a-zの文字が0〜25にマッピングされていることです。文字は昇順であるため、スケーリングされた数値から減算します。

このx[1]は(もすなわち数)は範囲を持っていない場合、それは動作しませんので、ワンライナーは、ハッキングの一種である

関連する問題