HOWTO · Python

Python の辞書順

このチュートリアルでは、Python の辞書順とは何かを示します。

このページの内容

Pythonでは、辞書式順序により文字列をUnicodeコードポイントに基づいて左から順に比較します。最初に異なる文字で順序が決まり、一方が他方の接頭辞なら短い方が先になります。リストをその場で並べ替えるには sort() を使い、順序付けた新しい結果を作るには sorted() を使います。異なる比較規則が必要な場合は、キー関数を指定します。

Pythonにおける辞書式順序の意味

辞書式順序では、項目を左から順に比較します。2つの項目が初めて異なる位置で、値の小さい方が先になります。一方が他方の接頭辞なら、短い方が先です。Pythonは文字列をUnicodeコードポイントで比較するため、大文字と小文字が区別され、読者の言語や地域に応じたアルファベット順の予想と異なる場合があります。大文字と小文字を区別せずに並べるには、str.casefold のようなキーを明示的に指定します。

文字列と単語を辞書式順序で並べ替える

リストをその場で並べ替えるには list.sort() を使います。戻り値は None です。元のイテラブルを変更せずに新しいリストが必要な場合は、sorted() を使います。キーを指定しない場合、Pythonは文字列を1文字ずつ比較します。

次の例を実行してください。コードと表示結果に含まれるラベルや文字列は英語表記のままです。

このセクションのコードと表示されるラベルや出力は英語のままです。

names = ["pear", "apple", "orange"]
names.sort()
print(names)
['apple', 'orange', 'pear']

省略可能な key 引数を使うと、比較に用いる値を指定できます。たとえば sorted(names, key=str.casefold) は大文字と小文字を区別せずに並べ替えます。格納されている文字列自体は変更しません。

文中の単語を並べ替えるには、まず文をリストに分割します。コードと表示結果に含まれるラベルや文字列は英語表記のままです。

sentence = "pear apple orange"
words = sentence.split()
words.sort()
print(words)
['apple', 'orange', 'pear']

split() は既定で、連続する空白を区切りとして分割します。単語を並べ替えると順序付きのリストになりますが、句読点を独立したトークンとして保ったり、元の空白を維持して文を再構成したりはしません。そうした情報も必要な場合は、目的に合ったルールでテキストをトークン化し、整形してください。

文字列内の文字を並べ替える

文字列は変更できません。そのため、sorted() で文字を並べ替え、結果のリストを結合して別の文字列を作ります。コードと表示結果に含まれるラベルや文字列は英語表記のままです。

このセクションのコードと表示されるラベルや出力は英語のままです。

word = "delftstack"
ordered_word = "".join(sorted(word))
print(ordered_word)
acdefklstt

結果は言語に応じたアルファベット順ではなく、コードポイント順になります。同じ文字が繰り返されている場合、その回数は保たれます。大文字と小文字を区別せずに並べるには、sorted() にキーを渡します。特定の言語の照合規則に従う必要がある場合は、コードポイント順がその規則と一致すると決めつけず、照合ライブラリを使ってください。

数値は辞書式ではなく数値として並べ替える

Pythonは整数を数値として比較します。そのため 2 は 10 より先になります。一方、これらの値を文字列に変換すると文字単位の比較になり、"10" が "2" より先になります。コードと表示結果に含まれるラベルや文字列は英語表記のままです。

このセクションのコードと表示されるラベルや出力は英語のままです。

numbers = [1, 4, 5, 3, 10, 16, 12]
original = numbers.copy()
numbers.sort()
new_numbers = sorted(original)
print(numbers)
print(new_numbers)
print(original)
[1, 3, 4, 5, 10, 12, 16]
[1, 3, 4, 5, 10, 12, 16]
[1, 4, 5, 3, 10, 16, 12]

上記のどちらの呼び出しでも、数値の昇順リストが得られます。sort() は元のリストを変更し、sorted() は別のリストを返します。数値文字列を値に基づいて並べ替えるには、sorted(values, key=int) のようにキー関数で数値へ変換します。書式を保つ必要がある場合は、元の文字列を残してください。

選択したフィールドでタプルを並べ替える

既定では、タプルは各フィールドを辞書式に比較して並べ替えられます。Pythonは最初のフィールドを比較し、そこが同じ場合は後続のフィールドを比較します。特定のフィールドを主な基準にするには、キー関数を渡します。itemgetter(1) は2番目のフィールド(インデックス1)を選びます。コードと表示結果に含まれるラベルや文字列は英語表記のままです。

このセクションのコードと表示されるラベルや出力は英語のままです。

from operator import itemgetter

produce = [(1, "pear"), (3, "orange"), (2, "banana")]
by_name = sorted(produce, key=itemgetter(1))
print(by_name)
[(2, 'banana'), (3, 'orange'), (1, 'pear')]

選択したフィールドが主な並べ替え基準になりますが、各タプル全体はまとまったままです。複数の基準が必要な場合、キー関数はタプルを返すこともできます。たとえば (record[1].casefold(), record[0]) を使うと、大文字と小文字を区別しない名前順に並べ、次に識別子順で並べられます。リストをその場で更新するには sort() を使い、元の順序を保つには sorted() を使います。