チャポケのブログ

勉強したことをまとめておく。

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']