Python ソート:sort()、sorted()
sort() と sorted()
sort()は、リスト型のメソッドで、対象のリストそれ自体をソートする。
listA = [3, 1, 4, 1, 5, 9, 2, 6] listA.sort() print(listA) # [1, 1, 2, 3, 4, 5, 6, 9]
sorted()は、リスト・タプル・辞書などのイテラブル型のデータ配列を引数とする関数で、
対象のデータ配列は何も変更せずに、対象のデータ配列をソートした新しいリストを生成する。
引数での入力がリスト・タプル・辞書などに関わらず、生成されるものはリストになる。
listA = [3, 1, 4, 1, 5, 9, 2, 6] listZ = sorted(listA) print(listA) # [3, 1, 4, 1, 5, 9, 2, 6] print(listZ) # [1, 1, 2, 3, 4, 5, 6, 9]
下記では、昇順ソート・降順ソート・keyを用いたソートを、
sort()メソッドを使用した場合で説明しているが、
sorted()関数でも同様なことができる。
昇順ソート
昇順ソートする場合は、引数なしでsort()メソッドを使用する。
文字列のリストは、数字0~9・大文字A~Z・小文字a~zの順にソートされる。
listA = [3, 1, 4, 1, 5, 9, 2, 6] listB = ["c9", "AA", "b", "A", "a", "AB", "0a", "2"] listA.sort() listB.sort() print(listA) # [1, 1, 2, 3, 4, 5, 6, 9] print(listB) # ['0a', '2', 'A', 'AA', 'AB', 'a', 'b', 'c9']
降順ソート
降順ソートする場合は、sort()メソッドに引数 reverse=True を与えて使用する。
listA = [3, 1, 4, 1, 5, 9, 2, 6] listB = ["c9", "AA", "b", "A", "a", "AB", "0a", "2"] listA.sort(reverse=True) listB.sort(reverse=True) print(listA) # [9, 6, 5, 4, 3, 2, 1, 1] print(listB) # ['c9', 'b', 'a', 'AB', 'AA', 'A', '2', '0a']
keyを用いたソート
keyに組み込み関数や自作関数を指定して、その結果の値でソートする。
listC = [-3, -1, 0, 2, 4] listC.sort(key=abs) # 絶対値 print(listC) # [0, -1, 2, -3, 4] listD = ["CCCCC", "AA", "BBB"] listD.sort(key=len) # 文字列の長さ print(listD) # ['AA', 'BBB', 'CCCCC'] def nimojime(x): return x[1] listE = ["America", "China", "Japan"] listE.sort(key=nimojime) # 2文字目 print(listE) # ['Japan', 'China', 'America']
keyにラムダ式を指定して、その結果の値でソートする。
listF = ["Tokyo", "Nagoya", "Osaka"] listF.sort(key=lambda x: x[2]) # 3文字目 print(listF) # ['Osaka', 'Nagoya', 'Tokyo']
keyに「指定インデックスの値取得:operator.itemgetter() 」を指定して、その結果の値でソートする。
下記では、各リストの2番目の値でソートしている。
import operator listG = [[3000, 3], [1111, 2], [9999, 1]] listG.sort(key=operator.itemgetter(1)) # 各リストの2番目の値 print(listG) # [[9999, 1], [1111, 2], [3000, 3]]
keyに「属性の取得:operator.attrgetter() 」を指定して、その結果の値でソートする。
下記では、datetimeの月属性値でソートしている。
import operator import datetime listH = [datetime.date(2000, 2, 23), datetime.date(2015, 5, 18), datetime.date(2020, 1, 13)] listH.sort(key=operator.attrgetter("month")) # 月属性 print(listH) # [datetime.date(2020, 1, 13), datetime.date(2000, 2, 23), datetime.date(2015, 5, 18)]
keyに「メソッドの実行結果の取得:operator.methodcaller() 」を指定して、その結果の値でソートする。
下記では、find関数で"a"の見つかる位置でソートしている。
import operator listI = ["Yokohama", "Chiba", "Saitama"] listI.sort(key=operator.methodcaller("find", "a")) # "a"の見つかる位置 print(listI) # ['Saitama', 'Chiba', 'Yokohama']