概要
辞書の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の組み合わせにより抽出をしてみましたが、便利な関数等があれば是非教えていただきたいです。