ABC155 C - Pollで連想配列で解ける問題が出たが、表題の処理がうまく書けなかったのでメモ。
最大値を持つkeyは複数あることを想定しています。(2020/02/19更新)
dic_max.py
# 適当に辞書初期化
d = {}
d["k1"] = 10
d["k2"] = 20
print(d)
# {'k1': 10, 'k2': 20}
dic_max.py
# 辞書dのvalueの最大値を取り出す処理 -> max(d.values())
max_val = max(d.values())
print(d.values())
print(max(d.values()))
# dict_values([10, 20])
# 20
# これはエラー
# print(d.value[0])
# TypeError: 'dict_values' object does not support indexing
dic_max.py
# keyとvalueをfor文で回す前処理 -> d.items()
print(d.items())
# dict_items([('k1', 10), ('k2', 20)])
# これはエラー
# print(d_i[0])
# TypeError: 'dict_items' object does not support indexing
dic_max.py
max_k_ls = [kv[0] for kv in d.items() if kv[1]==max_val]
# d.items() = dict_items([('k1', 10), ('k2', 20)])からループ一回目は
# kv = ('k1', 10)として取り出せる(kv[0] = 'k1'、kv[1] = 10)。
# kv[1] == max_valでvalue最大値と同じ値の時だけリストにkv[0](=key)追加
# 二回目以降も同様
# リストやタプルに*を付けて引数に指定 -> 展開されてそれぞれの要素が個別に渡される
print(*max_k_ls)
# k2
参考サイト
AtCoder Beginner Contest 155
Pythonで辞書の値の最大値・最小値とそのキーを取得
追記
コメントでアドバイス頂いた手法
@shiracamus さん
@konandoiruasa さん
@nkay さん
ありがとうございます。
・keyの最大値に被りが無い場合
>>> d = {"k1": 10, "k2": 20}
>>> d
{'k1': 10, 'k2': 20}
>>> max(d, key=lambda k: d[k])
'k2'
・pandasを使った手法
>>> import pandas as pd
>>> import numpy as np
>>> d = {"k1": 10, "k2": 20, "k3": 20}
>>> df = pd.DataFrame([d])
>>> list(df.columns[np.where(df.iloc[0] == df.iloc[0].max())])
['k2', 'k3']