Pythonでリストをソートするsortとsortedの違い
Pythonでリストを昇順または降順にソートするにはsort()
とsorted()
の2つの方法がある。文字列やタプルをソートしたい場合はsorted()
を使う。
昇順・降順にソートするのではなく要素を逆順に並べ替えたりランダムにシャッフルしたい場合は以下の記事を参照。
リスト型のメソッドsort()
: 元のリストをソート
sort()
はリスト型のメソッド。
元のリスト自体を書き換える破壊的処理。
l = [3, 1, 4, 5, 2]
l.sort()
print(l)
# [1, 2, 3, 4, 5]
sort()
はNone
を返す。
print(l.sort())
# None
デフォルトは昇順。降順にソートしたい場合は引数reverse
をTrue
とする。
l.sort(reverse=True)
print(l)
# [5, 4, 3, 2, 1]
組み込み関数sorted()
: ソートした新たなリストを生成
sorted()
は組み込み関数。
引数にリストを指定するとソートされたリストを返す。元のリストは変更されない非破壊的処理。
l = [3, 1, 4, 5, 2]
l_sorted = sorted(l)
print(l_sorted)
# [1, 2, 3, 4, 5]
print(l)
# [3, 1, 4, 5, 2]
sort()
と同様にデフォルトは昇順。降順にソートしたい場合は引数reverse
をTrue
とする
l_reverse_sorted = sorted(l, reverse=True)
print(l_reverse_sorted)
# [5, 4, 3, 2, 1]
print(l)
# [3, 1, 4, 5, 2]
sort()とsorted()の引数keyの使い方
sort()
とsorted()
には引数key
がある。
引数key
には引数を一つ受け取る呼び出し可能オブジェクト(関数など)を指定でき、要素に何らかの処理を行った結果をもとにソート可能。
例えば、絶対値でソートしたり、文字数でソートしたりできる。例ではsorted()
を使っているが、sort()
でも同様。
l = [-3, 1, 4, -5, 2]
print(sorted(l))
# [-5, -3, 1, 2, 4]
print(sorted(l, key=abs))
# [1, 2, -3, 4, -5]
l = ['b', 'cc', 'aaa']
print(sorted(l))
# ['aaa', 'b', 'cc']
print(sorted(l, key=len))
# ['b', 'cc', 'aaa']
引数key
の詳細や、引数key
を活用した具体例は以下の記事を参照。
- 関連記事: Pythonのsorted()やmax()などで引数keyを指定
- 関連記事: Pythonで辞書のリストを特定のキーの値に従ってソート
- 関連記事: Pythonで2次元配列(リストのリスト)をソート
- 関連記事: Pythonでゼロ埋めなしの数字の文字列リストをソート
文字列、タプルをソートする方法
文字列、タプルはイミュータブル(更新不可)なので、元のオブジェクトを書き換えるsort()
メソッドは用意されていない。
一方、ソートしたリストを新たなオブジェクトとして生成するsorted()
関数の引数にはリストだけでなく文字列やタプルなどのイテラブルオブジェクトも指定できる。
文字列のソート
sorted()
関数の引数に文字列を指定すると、ソートされた文字列の一文字ずつを要素とするリストが返される。
s = 'cebad'
l_sorted = sorted(s)
print(l_sorted)
# ['a', 'b', 'c', 'd', 'e']
print(s)
# cebad
文字列のリストを連結して一つの文字列にするにはjoin()
メソッドを使う。
s_sorted = ''.join(l_sorted)
print(s_sorted)
# abcde
まとめて書いてもよい。降順にソートしたい場合は引数reverse
をTrue
とする。
s_sorted = ''.join(sorted(s))
print(s_sorted)
# abcde
s_reverse_sorted = ''.join(sorted(s, reverse=True))
print(s_reverse_sorted)
# edcba
なお、上の例はあくまでも文字列自体のソートで、文字列を要素とするリストはsort()
でもsorted()
でもソート可能。
l = ['banana', 'cherry', 'apple']
print(sorted(l))
# ['apple', 'banana', 'cherry']
l.sort()
print(l)
# ['apple', 'banana', 'cherry']
文字列の大小関係(順序)は文字のUnicodeコードポイント(文字コード)によって決まる。以下の記事を参照。
タプルのソート
タプルについても文字列と同様。sorted()
関数の引数にタプルを指定すると、要素がソートされたリストが返される。
t = (3, 1, 4, 5, 2)
l_sorted = sorted(t)
print(l_sorted)
# [1, 2, 3, 4, 5]
print(t)
# (3, 1, 4, 5, 2)
リストからタプルへの変換はtuple()
を使う。
t_sorted = tuple(l_sorted)
print(t_sorted)
# (1, 2, 3, 4, 5)
まとめて書いてもよい。降順にソートしたい場合は引数reverse
をTrue
とする。
t_sorted = tuple(sorted(t))
print(t_sorted)
# (1, 2, 3, 4, 5)
t_reverse_sorted = tuple(sorted(t, reverse=True))
print(t_reverse_sorted)
# (5, 4, 3, 2, 1)