LoginSignup
6
5

More than 5 years have passed since last update.

Pythonの辞書からたった一行で値が最大のkeyを取得する

Last updated at Posted at 2018-01-18

辞書型ってなに?

省略します。以下が分かりやすいです。
Pythonの辞書 初心者向けガイド

とりあえず結論からいってみる

dictから値が最大の項目のkeyを取得するには、以下のコードを書きます。

max(dict.items(),key = lambda x:x[1])[0]

わぁ簡単!とはならず、なるほど分からん。
ってことで調べてみる。

分解してみた

①ひとまずそのまま出力してみる

実装

#辞書の定義
dict = {"a": 300, "b": 200, "c": 100}

#max値を求める
result = max(dict.items(),key = lambda x:x[1])[0]

#出力する
print("①max値の出力:",result)

実行結果

①max値の出力: a

②分解して出力してみる

実装

#辞書の定義
dict = {"a": 300, "b": 200, "c": 100}

#max値を求める
result = max(dict.items(),key = lambda x:x[1])[0]

#出力する
print("①max値の出力:",result)

#dict.itemsを見てみる
print("②dict.itemsの中身:", dict.items())
print("dict.itemsのtype:", type(dict.items()),"\n")

#keyを無くしてみる
print("③keyを無くして出力:",max(dict.items())[0])
print("keyを無くしてtype出力:",type(max(dict.items())[0]),"\n")

#lambdaの関数を変えてみる
print("④lambda式を変えて出力:",max(dict.items(),key = lambda x:x[0])[0])
print("lambda式を変えてtype出力:",type(max(dict.items(),key = lambda x:x[0])[0]),"\n")

#最後の参照先を変えてみる
print("⑤参照先を変えて出力:",max(dict.items(),key = lambda x:x[1])[1])
print("参照先を変えてtype出力:",type(max(dict.items(),key = lambda x:x[1])[1]),"\n")

#最後の参照先をなくしてみる
print("⑥参照先をなくして出力:",max(dict.items(),key = lambda x:x[1]))
print("参照先をなくしてtype出力:",type(max(dict.items(),key = lambda x:x[1])),"\n")

実行結果

①max値の出力: a
②dict.itemsの中身: dict_items([('a', 300), ('b', 200), ('c', 100)])
dict.itemsのtype: <class 'dict_items'> 

③keyを無くして出力: c
keyを無くしてtype出力: <class 'str'> 

④lambda式を変えて出力: c
lambda式を変えてtype出力: <class 'str'> 

⑤参照先を変えて出力: 300
参照先を変えてtype出力: <class 'int'> 

⑥参照先をなくして出力: ('a', 300)
参照先をなくしてtype出力: <class 'tuple'> 


考察してみる

  • ②及び⑥の出力結果から、そもそもdict.itemsがまずタプルの集合であることが分かった。 タプルは、要は変更できないリストのこと。 (Pythonのリスト・タプル・ディクショナリ)
  • ③の出力結果から、max関数はオプションでkeyを指定しない場合、key項目のマックス値を取得することが分かった。(a < b < c)
  • ④の出力結果から、keyに入れる項目に応じてどの項目を元にマックス値を取得するか判別していることが分かった。[0]の場合はタプルの1番目なので、keyを元に取得。[1]の場合はタプルの2番目なので、要素を元に取得している。
  • ⑥の出力結果から、辞書にmax関数を適用させた場合は、返り値がタプルであることがわかった。

つまりこういう発想ね。

  1. dict.items():辞書からタプルに一旦置き換える。
  2. max(dict.items()):タプル群の中から最大値を取得。(dictのkeyを元にする)
  3. max(dict.items(),key = lambda x:x[1]):タプル群の最大値を取得するが、タプルの要素の2番目(辞書でいう要素部分)を元に最大値を取得する。
  4. max(dict.items(),key = lambda x:x[1])[0]:取得した最大値タプルの要素の0番目(辞書で言うkey部分)を取得する。

なるほどすっきりした。

あとがき

pythonは短いコード数で便利に書ける半面、中身がどうなっているか悩むことが多々ある。そのまま使い続けるだけでなく中身まで理解して使えるようになりたい。何か調査して欲しいことがあればコメントにて。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5