辞書(dict)のソートは、リストと同じsorted()関数を使います。しかし、リストと違って辞書は、要素としてキーと値を持つため、どちらを基準にソートするのかでやり方が少々異なります。
ここでしっかりと解説していきます。
1. sorted()関数
辞書の要素をソートするには、sorted()関数を使います。
sorted(辞書)
sorted()関数は、辞書の要素をソートした新しいリストを作成します。
辞書はそもそも値をキーで保持しているため、ソートを行うと値をインデックス番号で保持するリストに変換されるためです。
同じ理由で、元のオブジェクトの要素をソートするsort()メソッドは辞書には使えません。
ソートの法則は以下の通りです。
- 数値:昇順
- 英字:アルファベット昇順(大文字優先)
- かな・カナ:あいうえお・アイウエオ昇順
- 文字が混在する場合:ユニコード順(アルファベット→かな→カナ順)
なお、キーをソートしたいのか、値をソートしたいのか、それとも両方をソートしたいのかで、sorted()関数に渡す時に、辞書に対してメソッドを実行します。
それらのメソッドについては「Pythonの辞書のキーの存在確認や取得」で解説しています。
1.1. キーをソート|keys()メソッド
sorted()関数の引数に辞書をそのまま渡すと、辞書のキーのみをソートしてリスト化します。
dict = {1:'red', 2:'blue', 3:'yellow'}
keys_sorted1 = sorted(dict)
print(keys_sorted1)
キーが数値なので昇順でソートされます。
または、次のように引数に渡す時にkeys()メソッドを実行しても構いません。
keys_sorted1 = sorted(dict.keys())
print(keys_sorted1)
keys()メソッドを使わなくても、自動的にキーをソートするので基本的には必要ありません。
しかし、同じ開発チームのメンバーに、キーでソートしていることを明示したいなど、コードの可読性を向上したいという意図がある場合は、積極的に使って良いでしょう。
1.2. 値をソート|values()メソッド
値のみをソートするには、sorted()関数に渡す時に、辞書にvalues()メソッドを実行しておきます。
values_sorted = sorted(dict.values())
print(values_sorted)
英字なのでアルファベット昇順でソートされます。
1.3. 両要素をソート|items()メソッド
キーと値の両方をソートして取得したい場合は、辞書にitems()メソッドを実行してからsorted()関数に渡します。
items_sorted = sorted(dict.items())
print(items_sorted)
この場合、ソートはキーを基準として行われます。
値を基準としてソートするには、次のように、第二引数のkey引数に関数を渡します。
items_sorted = sorted(dict.items(), key = lambda x : x[1])
print(items_sorted)
key引数については後述します。
2. 降順ソート|reverse=True
辞書を降順でソートしたい場合は、sorted()関数のオプション引数で「reverse=True」と書きます。
sorted(辞書, reverse=True)
先ほどと同じ辞書を使って、実行してみましょう。
2.1. キーの降順ソート
まずはキーを降順でソートしています。
dict = {1:'red', 2:'blue', 3:'yellow'}
keys_sorted1 = sorted(dict, reverse=True)
print(keys_sorted1)
2.2. 値の降順ソート
以下は、値を降順でソートしたものです。
values_sorted = sorted(dict.values(), reverse=True)
print(values_sorted)
2.3. 両要素の降順ソート
キーを基準に降順ソートした上で、キーと値の両方を取得したものです。
items_sorted = sorted(dict.items(), reverse=True)
print(items_sorted)
値を基準に降順ソートした上で、両方を取得したい場合は次のように書きます。
items_sorted = sorted(dict.items(), reverse=True, key=lambda x : x[1])
print(items_sorted)
3. ソートの法則を変える|key=関数名
オプション引数で、key引数を指定することによってソートの法則を変えることができます。
sorted(辞書, key=関数)
Pythonにもともとある組み込み関数も入れられますし、独自関数も入れられます。
つまり独自関数を作ることができると、自分で様々にソート条件を設定できるということです。
例えば、辞書のキーや値を長さ順にソートしたい場合は、key引数で「key=len」と書きます。
以下の例では、数値にlen()関数は使用できないため、キーではなく値を長さ順(文字数順)でソートしています。
dict = {1:'red', 2:'blue', 3:'yellow'}
values_sorted1 = sorted(dict.values(), key=len)
print(values_sorted1)
「reverse=True」と併用することで降順ソートも可能です。
values_reversed = sorted(dict.values(), reverse=True, key=len)
print(values_reversed)
また、先ほど、「key = lambda x : x[1]」と書いて、値をソートした上で、要素の両方をリスト化しました。
これは「lambda式(ラムダ式)」で2つ目の要素を参照する無名関数を作って、それをソート基準にしているから可能になっています。
少しだけ解説しておきます。
以下のコードではlambda式で作った同じ関数に、「see_second」という関数名をつけています。この関数をリストに実行すると、2番目(インデックス1番)の要素を参照しています。
see_second = lambda x : x[1]
list = [0, 1, 2]
print(see_second(list))
このラムダ式を、key引数に指定しているために、キーではなく値を基準にソートした上で、両方をリスト化しているのですね。
なお関数の自作については、以下の記事で解説しています。
なお、sorted()関数のkey引数に関しては「Pythonのリストのソートまとめ」でも解説していますので、読み返して頂くと、より理解が深まると思います。
4. まとめ
辞書のソートにはsorted()関数を使います。
リストの場合と違って、辞書では、キーか、値か、それとも両方をソートするのかによって、keys()メソッド、values()メソッド、items()メソッドを使い分ける必要があります。
「reverse=True」やkey引数などの他の点に関しては、リストに対して使う場合と全く同じです。
コメント