Pythonでリストをソートするsortとsortedの違い

Modified: | Tags: Python, リスト

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

デフォルトは昇順。降順にソートしたい場合は引数reverseTrueとする。

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()と同様にデフォルトは昇順。降順にソートしたい場合は引数reverseTrueとする

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を活用した具体例は以下の記事を参照。

文字列、タプルをソートする方法

文字列、タプルはイミュータブル(更新不可)なので、元のオブジェクトを書き換える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

まとめて書いてもよい。降順にソートしたい場合は引数reverseTrueとする。

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)

まとめて書いてもよい。降順にソートしたい場合は引数reverseTrueとする。

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)

関連カテゴリー

関連記事