辞書型(dict型)はkey:valueペアで構成されているデータ型です。
プログラムによっては
- keyが最大(最小)の時のvalueを知りたい
- valueが最大(最小)の時のkeyを知りたい
といった場合があると思います。
今回は、そんな場合に役に立つ、dict型における最大値(最小値)の求め方についてまとめます。
#2019/4/21 記事更新
確認した環境
- OS: Ubuntu 16.04LTS
- Python: ver3.7.2
※最大値・最小値は、max()とmin()が異なるだけなので、本記事では最大値のみ記載します。最小値の場合は、max()をmin()に読み替えて頂けると良いです。
キー(Key)の最大値、およびその時の値(value)を取得
キー(key)の最大値は、max()関数の引数に
- 辞書データ(dict)、または
- dict.keys()
を渡すと取得できます。具体例を以下に示します。
>>> dic = {'A':5, 'B':4, 'C':3, 'D':2, 'E':1}
#キー(Key)の最大値を取得する
>>> max(dic)
'E'
#keys()メソッドを使っても同じ
>>> max(dic.keys())
'E'
また、この時の値(value)は辞書データより求められます。
>>> dic = {'A':5, 'B':4, 'C':3, 'D':2, 'E':1}
>>> dic['E']
1
値(value)の最大値を取得
値(value)の最大値は、dict.values()を引数に渡すと取得できます。
>>> dic = {'A':5, 'B':4, 'C':3, 'D':2, 'E':1}
#値(value)の最大値を取得する
>>> max(dic.values())
5
キー(key)が最大となる項目(key:valueペア)を取得
キー(key)が最大となる項目(key:valueペア)を取得するには、dict.items()メソッドをmax()の引数に渡します。
>>> dic = {'A':5, 'B':4, 'C':3, 'D':2, 'E':1}
#キーの最大値を取得する
>>> max(dic.items())
('E', 1)
値(value)が最大となる時のキー(key)の値を取得
値(value)が最大となる時のキー(key)の値を取得するには、2つ方法があります。
- max()のkeyパラメータを使う方法
- リスト内包表記を使う方法
max()のkeyパラメータを使う方法
sorted()の場合と同様に、keyパラメータにlambda関数を用いて値の大きさを比較する要素の位置を指定します。
>>> dic = {'A':5, 'B':4, 'C':3, 'D':2, 'E':1}
#値(value)が最大となる時のキー(key)の値を取得する
>>> max(dic.items(), key = lambda x:x[1])[0]
'A'
#参考
>>> max(dic.items(), key = lambda x:x[1])
('A', 5)
リスト内包表記を使う方法
>>> max((v, k) for k, v in dic.items())[1]
'A'
#参考
>>> max((v, k) for k, v in dic.items())
(5, 'A')
リスト内包表記については以下の記事でもまとめています。ご参照ください。
→ [Python] リスト内包表記を使いこなす
尚、これらの方法は最初に見つかった最大値をひとつだけ出力するものであり、最大値が複数ある場合は注意が必要です。
前者(keyパラメータを使う方法)と、後者(リスト内包)を使う方法で結果が異なる場合があります。
以下に例を示します。
>>> dic2 = {'A':5, 'B':4, 'C':3, 'D':2, 'E':5}
# keyパラメータを使う方法
>>> max(dic2.items(), key = lambda x:x[1])[0]
'A'
# リスト内包表記を使う方法
>>> max((v, k) for k, v in dic2.items())[1]
'E'
#参考
>>> max(dic2.items(), key = lambda x:x[1])
('A', 5)
>>> max((v, k) for k, v in dic2.items())
(5, 'E')
Keyパラメータを使った場合は、辞書の値(value)の最大値のうち最初にヒットしたキー(key)を出力するのに対し、リスト内包表記を使った場合は、タプルの2番めの要素(上記例では”k”)が比較され、それが大きい方が出力されています。
値(value)が最大値の時のキー(key)を全て取得
値(value)が最大となる要素のキー(key)を全て抽出するには、リスト内包表記を使って以下のように書けます。
>>> [k for k, v in dic2.items() if v == max(dic2.values())]
['A', 'E']
まとめ
辞書データの最大値について、以下4パターンについてまとめました。
- キー(Key)の最大値
- 値(value)の最大値
- キー(key)が最大となる項目(key:valueペア)
- 値(value)が最大となる時のキー(key)
- keyパラメータを使う方法
- リスト内包表記を使う方法
値(value)が最大となる時のキー(key)を取得する際は、最大値が複数存在する場合は結果が異なる場合があるので、2つの方法を使い分ける必要があります。
尚、最小値についてはmax()関数をmin()関数に読み替えれば良いです。