python listソートの2つの方法と例の説明

3260 ワード

リストをソートし、Pythonは2つの方法を提供しています.
方法1.Listの組み込み関数list.sortソート
list.sort(func=None, key=None, reverse=False)
Pythonの例:
>>> list = [2,5,8,9,3]  
>>> list  
[2,5,8,9,3]  
>>> list.sort()  
>>> list  
[2, 3, 5, 8, 9]

方法2.シーケンスタイプ関数sorted(list)でソート
Pythonの例:
>>> list = [2,5,8,9,3]  
>>> list  
[2,5,8,9,3]  
>>> sorted(list)  
[2, 3, 5, 8, 9]

2つの方法の違い:
sorted(list)は、式として使用できるオブジェクトを返します.元のlistは変わらず、新しい順序のlistオブジェクトを生成します.
list.sort()はオブジェクトを返さず、既存のlistを変更します.他のsortの例:
例1:順方向ソート
>>>L = [2,3,1,4]
>>>L.sort()
>>>L
>>>[1,2,3,4]

例2:逆ソート
>>>L = [2,3,1,4]
>>>L.sort(reverse=True)
>>>L
>>>[4,3,2,1]

例3:2番目のキーワードのソート
>>>L = [('b',6),('a',1),('c',3),('d',4)]
>>>L.sort(lambda x,y:cmp(x[1],y[1])) 
>>>L
>>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]

例4:2番目のキーワードのソート
>>>L = [('b',6),('a',1),('c',3),('d',4)]
>>>L.sort(key=lambda x:x[1]) 
>>>L
>>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]

例5:2番目のキーワードのソート
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>import operator
>>>L.sort(key=operator.itemgetter(1)) 
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

例6:(DSUメソッド:Decorate-Sort-Undercorate)
>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
>>>A.sort()
>>>L = [s[2] for s in A]
>>>L
>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

以上、6のリストをソートする方法を示したが、インスタンス3.4.5.6は、リストitemのいずれかの項目に対して機能する
比較キーワードをソートする.
効率比較:
cmp < DSU < key

実験比較により,方法3は方法6より遅く,方法6は方法4より遅く,方法4と方法5はほぼ同等であった.
複数キーワード比較ソート:
例7:
>>>L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:x[1])
>>> L
>>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]

このとき並べ替えられたLは2番目のキーワードだけで並べられていることがわかります.
2番目のキーワードで並べ替えてから1番目のキーワードで並べ替えたい場合は?2つの方法があります
例8:
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:(x[1],x[0]))
>>> L
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

例9:
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=operator.itemgetter(1,0))
>>> L
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

なぜインスタンス8は機能するのでしょうか.なぜならtupleは左から右に比較され、1つ目を比較し、等しい場合は2つ目を比較するからです.