key関数にデバッグプリントを仕込むと理由が良く分かります。
Python
1def key_func(x):
2 print(x, x[1])
3 return x[1]
4
5dct = {
6 "japan": 115,
7 "china": 229,
8 "brazil": 89,
9 "usa": 873,
10 "uk": 543,
11 "rossia": 24,
12 "kenya": 477
13}
14
15items_sorted = sorted(dct, key=key_func, reverse=True)
16print(items_sorted)
実行結果 Wandbox
japan a
china h
brazil r
usa s
uk k
rossia o
kenya e
['usa', 'brazil', 'rossia', 'uk', 'china', 'kenya', 'japan']
(key, value) の組を期待しているのだと思いますが、実際にはkeyだけしか渡されていません。
上の結果はどのようにソートされたものなのでしょうか?
国名の1文字目(最初の文字が0文字目)の、降順。
uSa > bRazil > rOssia > uK > cHina > kEnya > jApan
解決策
またlambdaを使ってどのように記述すれば正しく出力されるのでしょか?
dict.itemsを利用してタプルを抜き出し、ソート後辞書に変換します。
Python
1import collections
2
3dct = {
4 "japan": 115,
5 "china": 229,
6 "brazil": 89,
7 "usa": 873,
8 "uk": 543,
9 "rossia": 24,
10 "kenya": 477
11}
12
13items_sorted = sorted(dct.items(), key=lambda x: x[1], reverse=True)
14print(items_sorted)
15
16sorted_dct = collections.OrderedDict(items_sorted)
17print(sorted_dct)
実行結果 Wandbox
[('usa', 873), ('uk', 543), ('kenya', 477), ('china', 229), ('japan', 115), ('brazil', 89), ('rossia', 24)]
OrderedDict([('usa', 873), ('uk', 543), ('kenya', 477), ('china', 229), ('japan', 115), ('brazil', 89), ('rossia', 24)])
Python3.7以降をご利用の場合は、ただの辞書を使っても挿入順を保証できます。
逆に3.6以前であればOrderedDictを使うべきでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/24 03:08
2020/04/24 03:11