koji/メガネ男の日誌

日々の学び、活動状況を記録します。仕事のことは少なめ。

辞書型データの中から、Value値が最大のKey値を抽出する

東京大学のデータサイエンティスト育成講座の課題、総合問題9-1をやっていて、辞書型データの中から、Value値が最大のKey値を抽出する方法について、理解につまづいたので、まとめました。

# 辞書型のデータ
results = {('85123A', 22423): 0.013,
 ('85123A', '85099B'): 0.014,
 ('85123A', 84879): 0.015,  # Value値が最大
 ('85123A', 20725): 0.012,
 ('85123A', 22720): 0.011,
 ('85123A', 20727): 0.010,
 ('85123A', 'POST'): 0.001,
 ('85123A', 23203): 0.007,
 ('85123A', 22383): 0.011,
 ('85123A', 22197): 0.010,
 ('85123A', 21212): 0.008,
 ('85123A', 23209): 0.008,
 ('85123A', 23298): 0.009,
 ('85123A', 22086): 0.006,
 ('85123A', 22382): 0.010,
 (22423, '85099B'): 0.009}

①テキストに書いてあったコード

maxKey = max([(v,k) for k,v in results.items()])[1]
maxKey

出力結果 辞書型データのValue値が最大の0.015のKey値が出力される ('85123A', 84879)

①は正しい結果が出力されるのですが、max()の後にValue値を出すための配列指定[1]があるところが、 イメージしづらくてつまづきました。

②下記サイトを参考にしたコード

# Value値が最大となるStockCodeの組み合わせを抽出
maxKey = [k for k, v in results.items() if v == max(results.values())][0]
maxKey

出力結果 同じく、辞書型データのValue値が最大の0.015のKey値が出力される ('85123A', 84879)

参考 note.nkmk.me

個人的には、②のコードのほうが、v に代入された バリュー値と、 max(results.values())によって算定されたバリュー値の最大値が一致する k(Key値)をすっきり表している気がして 個人的には好みです。

もちろんどちらも正しい結果が出力されるわけですが。

以上になります、最後までお読みいただきありがとうございます。