0
0

More than 3 years have passed since last update.

辞書のValue値が最も高いkeyの値を出力する

Last updated at Posted at 2020-05-04

概要

辞書のValue値が最も高いkeyの値を出力する方法について考えてみた。

辞書の値
s = {"C":10, "A":8, "B":10, "D":7, "E":5, "F":4, "G":6}

ケース1:value値が同じ場合は、アルファベット順が小さいkeyを出力する。

1.sortedでvalue値を昇順(Default)並び変える
sortedは辞書型に使えないので、list(s.items())としています。
2.maxでvalueが最も大きいタプルを抜き出す。

s = {"C":10, "A":8, "B":10, "D":7, "E":5, "F":4, "G":6}
sorted_s = sorted(list(s.items()), key= lambda x:x[1])
print(sorted_s)
[('F', 4), ('E', 5), ('G', 6), ('D', 7), ('A', 8), ('B', 10), ('C', 10)]
max_value_key = max(sorted_s,key=lambda x:x[1])
print(max_value_key[0])
B

ケース2:value値が同じ場合は、アルファベット順が大きいkeyを出力する。

1.sortedでvalue値を降順(reverse=True)で並び変える
sortedは辞書型に使えないので、list(s.items())としています。
2.maxでvalueが最も大きいタプルを抜き出す。

Tips!
max(iterable, *[, key, default])
位置引数が1つだけ与えられた場合、それはは空でない iterable でなくてはいけません。その iterable の最大の要素が返されます。2 つ以上のキーワード無しの位置引数が与えられた場合、その位置引数の中で最大のものが返されます。
最大の要素が複数あるとき、この関数はそのうち最初に現れたものを返します。

ということはsortedするときのkeyにkey値も対象として、reverse=Trueにすれば出力できそう。※注意keyに複数指定した場合、keyごとに昇順/降順を指定することはできない。


s = {"C":10, "A":8, "B":10, "D":7, "E":5, "F":4, "G":6}
sorted_s = sorted(list(s.items()), key= lambda x:(x[1], x[0]) reverse=True)
print(sorted_s)
[('C', 10), ('B', 10), ('A', 8), ('D', 7), ('G', 6), ('E', 5), ('F', 4)]
max_value_key = max(sorted_s,key=lambda x:x[1])
print(max_value_key[0])
C

ケース3:value値が同じ場合は、同じkeyをすべて出力する。

1.maxでvalueの最大値を抽出
2.辞書をリストに変換しvalueとなる値が1.と同じkey値を抽出

リスト内包でスッキリ


s = {"C":10, "A":8, "B":10, "D":7, "E":5, "F":4, "G":6}
max_value_key = [ i[0] for i in list(s.items()) if i[1] == max(s.values())]
print(" ".join(max_value_key))
C B

ケース4:1つ目のvalue値が同じ場合は、2つめのvalue値が小さいkeyを出力する。

複数のkeyを対象にソートを行う。
reverse=Trueとした場合、複数のkeyすべてに対して降順で並び替えが行われるので、
指定したkeyごとに昇順/降順でのソートが必要。

1.sortedの時に複数keyを指定する。この際、reverseではなくkeyごとに降順/昇順を行うよう指定する。
2.maxで1つ目のvalueが最も大きいタプルを抜き出す。

辞書
s = {"C":(10,4), "A":(8,2), "B":(10,8), "D":(7,9), "E":(5,8), "F":(4,7), "G":(6,2)}

s = {"C":(10,4), "A":(8,2), "B":(10,8), "D":(7,9), "E":(5,8), "F":(4,7), "G":(6,2)}
sorted_s = sorted(list(s.items()),key=lambda x:(-x[1][0],x[1][1]))
print(sorted_s)
[('C', (10, 4)), ('B', (10, 8)), ('A', (8, 2)), ('D', (7, 9)), ('G', (6, 2)), ('E', (5, 8)), ('F', (4, 7))]
max_value_key = max(sorted_s,key=lambda x:x[1][0])
print(max_value_key[0])
C

keyを複数指定する場合はタプルで指定する。比較優先はタプルの前のほうから。
keyの比較対象に"-"を入れると、そのkeyに対してのみ降順に並び替えが行われる。
reverseと併用した場合はreverseが優先される。

#reverse=Trueの場合
sorted_s = sorted(list(s.items()),key=lambda x:(x[1][0],x[1][1]),reverse=True)
print(sorted_s)
[('B', (10, 8)), ('C', (10, 4)), ('A', (8, 2)), ('D', (7, 9)), ('G', (6, 2)), ('E', (5, 8)), ('F', (4, 7))]

#key比較値の1つ目のvalue値に"-"をつけた場合
sorted_s = sorted(list(s.items()),key=lambda x:(-x[1][0],x[1][1]))
print(sorted_s)
[('C', (10, 4)), ('B', (10, 8)), ('A', (8, 2)), ('D', (7, 9)), ('G', (6, 2)), ('E', (5, 8)), ('F', (4, 7))]

まとめ

駆け出しパイソニスタのためモジュール知識がなく。。。sortedやmaxの組み合わせにより抽出をしてみましたが、便利な関数等があれば是非教えていただきたいです。

参考リンク

python Document
pythonのソートで複数キーを指定するとき

0
0
3

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
0
0