sorted関数でPythonのオブジェクト内要素のソート(並び替え)のイメージ画像

sorted関数でPythonのオブジェクト内要素のソート(並び替え)

  • 公開日:2018/10/28
  • 更新日:2018/10/28
  • 投稿者:n bit

Pythonの組み込み関数『sorted関数』について解説。sorted関数を使えばオブジェクト内の要素をソート(並び替え)することができます。sorted関数の使い方やその特性等について詳しく見ていきましょう。

  • Python

この記事は約 分で読めます。(文字)

sorted関数とは

sorted関数はPythonの組み込み関数の1つでリストやタプル、辞書、セット、文字列といった複数の要素を持つオブジェクト内の要素をソート(並び替え)し新たなリストで返す関数です。

Note

ソート

ソートとは特定の規則に従って要素を並べ替えること。昇順や降順に並べ替え整列させる作業。

sorted関数の主な用途

  • オブジェクト内の要素を持つオブジェクト内の要素をソート(並び替え)

sorted関数の使い方

sorted関数の使い方は複数の要素を持ちソートしたいオブジェクトを引数として渡します。

sorted(複数の要素を持ちソートしたいオブジェクト)

実際にsorted関数を使って様々なオブジェクト内の要素をソートしてみましょう。最初は利用頻度の高いデータ型『リスト』です。

list型(リスト)オブジェクト内の要素をsorted関数で昇順にソート

リストを代入した変数をsorted関数の引数に渡して返される値をチェックしてみます。返された値を出力させるためprint関数等に渡してください。

sorted関数はデフォルトの設定が昇順ソートで最も基本的な使い方です。

x = [5, 8, 4, 1, 3, 2, 7, 6]

y = sorted(x)
print(y)

出力結果

[1, 2, 3, 4, 5, 6, 7, 8]

リストオブジェクト内の要素が昇順でソートされ表示されました。

list型(リスト)オブジェクト内の要素をsorted関数で降順にソート

sorted関数で降順にソートさせるにはreverseオプションをTrueにします。

sorted(複数の要素を持ちソートしたいオブジェクト, reverse=True)

実際にオブジェクト内の要素を降順でソートしてみましょう。

x = [5, 8, 4, 1, 3, 2, 7, 6]

y = sorted(x, reverse=True)
print(y)

出力結果

[8, 7, 6, 5, 4, 3, 2, 1]

リストオブジェクト内の要素が降順でソートされました。

同じようにその他のデータ型もチェックしてみましょう。

tuple型(タプル)オブジェクト内の要素をsorted関数で昇順・降順にソート

タプルを代入した変数をsorted関数の引数に渡して返される値をチェックしてみます。

昇順

x = (5, 8, 4, 1, 3, 2, 7, 6)

y = sorted(x)
print(y)

出力結果

[1, 2, 3, 4, 5, 6, 7, 8]

降順

x = (5, 8, 4, 1, 3, 2, 7, 6)

y = sorted(x, reverse=True)
print(y)

出力結果

[8, 7, 6, 5, 4, 3, 2, 1]

タプルオブジェクトを引数に渡してもsorted関数は新しいリストオブジェクトで返します。最終の値もタプルオブジェクトにしておく必要がある場合は出力された値をタプルオブジェクトに変換しておきましょう。

昇順

x = (5, 8, 4, 1, 3, 2, 7, 6)

y = tuple(sorted(x))
print(y)

出力結果

(1, 2, 3, 4, 5, 6, 7, 8)

降順

x = (5, 8, 4, 1, 3, 2, 7, 6)

y = tuple(sorted(x, reverse=True))
print(y)

出力結果

(8, 7, 6, 5, 4, 3, 2, 1)

dict型(辞書)オブジェクト内のkeyをsorted関数で昇順・降順にソート

辞書を代入した変数をsorted関数の引数に渡して返される値をチェックしてみます。

昇順

x = {'b':20, 'c':30, 'a':40, 'd':10}

y = sorted(x)
print(y)

出力結果

['a', 'b', 'c', 'd']

降順

x = {'b':20, 'c':30, 'a':40, 'd':10}

y = sorted(x, reverse=True)
print(y)

出力結果

['d', 'c', 'b', 'a']

辞書オブジェクトからkeyでソートされたリストが出力されます。

dict型(辞書)オブジェクト内の値をsorted関数で昇順・降順にソート

辞書オブジェクトから値でソートしたリストを出力したい場合は.values()を利用します。

昇順

x = {'b':20, 'c':30, 'a':40, 'd':10}

y = sorted(x.values())
print(y)

出力結果

[10, 20, 30, 40]

降順

x = {'b':20, 'c':30, 'a':40, 'd':10}

y = sorted(x.values(), reverse=True)
print(y)

出力結果

[40, 30, 20, 10]

辞書オブジェクト内の要素が値のみ抽出されソートされたリストが確認できます。

dict型(辞書)オブジェクト内のkeyをsorted関数で昇順・降順にソート(値含む)

辞書オブジェクトをkeyでソートし紐付いた値も同時に出力したい場合は.items()をします。

昇順

x = {'b':20, 'c':30, 'a':40, 'd':10}

y = sorted(x.items())
print(y)

出力結果

[('a', 40), ('b', 20), ('c', 30), ('d', 10)]

降順

x = {'b':20, 'c':30, 'a':40, 'd':10}

y = sorted(x.items(), reverse=True)
print(y)

出力結果

[('d', 10), ('c', 30), ('b', 20), ('a', 40)]

keyとvalueがペアとなったタプルを要素に持つリストオブジェクトが確認できます。

dict()で辞書オブジェクトに戻すことはできますが残念ながら辞書オブジェクトはシーケンスオブジェクトではないため要素の順序を保持しません。そのため辞書オブジェクトに戻すことによりソート結果も無効になります。

各オブジェクトの特性

オブジェクトミュータブルシーケンス
int××
float××
str×
bool××
list
tuple×
dict×
set×
range×

str型(文字列)オブジェクト内の要素をsorted関数で昇順・降順にソート

文字列を代入した変数をsorted関数の引数に渡して返される値をチェックしてみましょう。

昇順

x = 'cba'

y = sorted(x)
print(y)

出力結果

['a', 'b', 'c']

降順

x = 'cba'

y = sorted(x, reverse=True)
print(y)

出力結果

['c', 'b', 'a']

『[‘a’, ‘b’, ‘c’]、[‘c’, ‘b’, ‘a’]』と表示されました。

文字列はアルファベット順に並べてa〜zに向けて値が大きくなります。そのため昇順であれば[‘a’, ‘b’, ‘c’]、降順であれば[‘c’, ‘b’, ‘a’]が返されました。

先ほどは小文字のみの文字列でしたが大文字と小文字が混ざった場合は大文字の方より最小値として認識します。

昇順

x = 'cbaBCA'

y = sorted(x)
print(y)

出力結果

['A', 'B', 'C', 'a', 'b', 'c']

降順

x = 'cbaBCA'

y = sorted(x, reverse=True)
print(y)

出力結果

['c', 'b', 'a', 'C', 'B', 'A']

大文字から最小値のため昇順であれば[‘A’, ‘B’, ‘C’, ‘a’, ‘b’, ‘c’]、降順であれば[‘c’, ‘b’, ‘a’, ‘C’, ‘B’, ‘A’]が返されました。

list型(リスト)オブジェクト内のstr型(文字列)要素をsorted関数で昇順・降順にソート

sorted関数はリストオブジェクトが要素として複数持つ単語(文字列)の最小値を判定する場合1文字目の文字で判定を行い、同じ1文字目を持つ単語が複数ある場合はさらに2文字目を使って判定します。

昇順

x = ['apple', 'Apple', 'amazon', 'Amazon', 'windows', 'Windows', 'walmart', 'Walmart']

y = sorted(x)
print(y)

出力結果

['Amazon', 'Apple', 'Walmart', 'Windows', 'amazon', 'apple', 'walmart', 'windows']

降順

x = ['apple', 'Apple', 'amazon', 'Amazon', 'windows', 'Windows', 'walmart', 'Walmart']

y = sorted(x, reverse=True)
print(y)

出力結果

['windows', 'walmart', 'apple', 'amazon', 'Windows', 'Walmart', 'Apple', 'Amazon']

オブジェクト内の要素で1文字目が最小値となるのは大文字のAを持つ’Apple’と’Amazon’です。次に2文字目で判定を行った場合『p』よりも『m』が小さな値となりますので『Amazon』から昇順はソートされて表示されました。

降順のソート順はこの逆の考え方です。

アルファベット、記号、数値、ダブルバイト文字が入り混じった文字列に対するsorted関数の処理

その他、記号や数値、ダブルバイト文字などが混じってきた場合、sorted関数はどうなるのか気になる方もいるかもしれません。実はこれらの判定はUnicodeに準拠して行われておりアルファベット以外に記号や数値、ダブルバイト文字が入り混じってもソートすることができます。

引数にkeyを渡してソートの基準を変更

sorted関数は引数にkeyとなる関数を指定することができます。引数にkeyを指定した場合はkeyの関数を基準にしてソートされます。

参考例としてkeyにlen関数を指定した動作を見てみましょう。len関数はオブジェクトのサイズ(長さ)を測る関数でしたね。

つまりlen関数をkeyに指定することでオブジェクト内の各要素の長さを比較してソート処理されます。

昇順

x = ['apple', 'Apple', 'amazon', 'Amazon', 'windows', 'Windows', 'walmart', 'Walmart']

y = sorted(x, key=len)
print(y)

出力結果

['apple', 'Apple', 'amazon', 'Amazon', 'windows', 'Windows', 'walmart', 'Walmart']

降順

x = ['apple', 'Apple', 'amazon', 'Amazon', 'windows', 'Windows', 'walmart', 'Walmart']

y = sorted(x, key=len, reverse=True)
print(y)

出力結果

['windows', 'Windows', 'walmart', 'Walmart', 'amazon', 'Amazon', 'apple', 'Apple']

リストオブジェクト内の文字列で最も文字数が少ないのは5文字の’apple’と’Apple’。同じ値を持つ要素が2つあるのため最初に出現した『apple』から昇順はソートされます。

降順のソート順はこの逆の考え方でリストオブジェクト内の文字列で最も文字数が多いのは7文字の’windows’, ‘Windows’, ‘walmart’, ’Walmart’。同じ値を持つ要素のためリストオブジェクト内で最初に出現した『windows』から降順はソートされます。

今日のdot

『sorted関数』はUnicodeに基づいてリスト、タプル、辞書、文字列等の複数の要素をソート(並び替え)し新たなリストで返します。

引数にkey関数を指定することでソートの基準を変更できます。覚えておくと2段階の処理を1度に行えますので便利です。