sort関数
sort() メソッドはリストにのみ定義されています。
>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]
sorted関数
sorted() 関数は第1引数が対象の iterator です。
第2引数でキーワード引数 key で順序を決めるための値をとり出す関数を指定します。
dict をソートするときなどに使用します。
【 第2引数を指定しない 】
a = {1:'D', 2:'C', 3:'B', 4:'E', 5:'A'}
for key, val in sorted(a.items()):
print(key, val)
#--表示----
1 D
2 C
3 B
4 E
5 A
第2引数を指定しない場合は a.items() が返す タプル型の1番目の値を
基準にソートされます。
【 dict の items() はタプルで値を返す 】
for line in sorted({1:'D', 2:'C', 3:'B', 4:'E', 5:'A'}.items()):
print(line)
#--表示----
(1, 'D')
(2, 'C')
(3, 'B')
(4, 'E')
(5, 'A')
sorted関数の key パラメータ
これは比較を行う前にリストの各要素に対して呼び出される関数を指定するパラメータです。
sorted関数の第2引数に使われます。
sorted関数の第2引数には順序を決めるための値をとり出す関数を指定するので key には関数を設定します。
【 lambda 式による関数設定(第2引数を指定する)】
a = {1: 'D', 2: 'C', 3: 'B', 4: 'E', 5: 'A'}
for key, val in sorted(a.items(), key=lambda x: x[1]):
print(key, val)
#--表示----
5 A
3 B
2 C
1 D
4 E
lambda 式より(x[1] ※x[0]では1番目の値が基準)タプルの2番目の値が基準でソートされます。
operator モジュール
operator モジュールには operator.itemgetter() 関数を利用すると、もっと簡単で高速に処理することができます。
from operator import itemgetter
a = {1: 'D', 2: 'C', 3: 'B', 4: 'E', 5: 'A'}
for key, val in sorted(a.items(), key=itemgetter(1)):
print(key, val)
#--表示----
5 A
3 B
2 C
1 D
4 E
上記の場合、operator モジュールの itemgetter の引数に 1 を渡すとタプルの2番目の値が基準でソートされます。
0 を渡すとタプルの1番目の値が基準でソートされます。
複数のソート順の設定
operator モジュールの itemgetter では複数のソート順を設定できます。
from operator import itemgetter
a = [('tanaka', 'B', 20), ('sato', 'A', 20), ('suzuki', 'B', 21), ('okada', 'A', 21)]
for line in sorted(a, key=itemgetter(2,1)):
print(line)
#--表示----
('sato', 'A', 20)
('tanaka', 'B', 20)
('okada', 'A', 21)
('suzuki', 'B', 21)
key=itemgetter(2,1) ではタプルの3番目の値が基準でソートし、そのあとにタプルの2番目の値が基準でソートします。
上記の場合はタプルの3番目の値(年齢)でソート(20->21)して次にタプルの2番目の値(血液型)でソートします。
昇順と降順
sorted 関数の第3引数に reverse に「True」を指定すると降順に「False」を指定すると昇順になります。
reverse を設定しなければ昇順となります。
【 reverse=True(降順)】
from operator import itemgetter
a = [('tanaka', 20), ('sato', 21), ('suzuki', 22), ('okada', 23)]
for line in sorted(a, key=itemgetter(1), reverse=True):
print(line)
#--表示----
('okada', 23)
('suzuki', 22)
('sato', 21)
('tanaka', 20)
【 reverse=False(昇順)】
from operator import itemgetter
a = [('tanaka', 20), ('sato', 21), ('suzuki', 22), ('okada', 23)]
for line in sorted(a, key=itemgetter(1), reverse=False):
print(line)
#--表示----
('tanaka', 20)
('sato', 21)
('suzuki', 22)
('okada', 23)