質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1188閲覧

lambdaを使ったdictionaryのsort(python3)

kentooo

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/04/24 02:27

pythonで以下のdictionaryをlambdaを使ってvalueでsortして数値が高い順にkeyを出力したいのですが、sort結果がバラバラになってしまいます。

dict = {
"japan": 115,
"china": 229,
"brazil": 89,
"usa": 873,
"uk": 543,
"rossia": 24,
"kenya": 477
}

items_sorted = sorted(dict, key=lambda x: x[1], reverse=True)
print(items_sorted)
print("")

と入力した結果が、以下のようにバラバラになってしまいます。

['usa', 'brazil', 'rossia', 'uk', 'china', 'kenya', 'japan']

上の結果はどのようにソートされたものなのでしょうか?
またlambdaを使ってどのように記述すれば正しく出力されるのでしょか?

どうぞ宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

python

1 2dict = { 3 "japan": 115, 4 "china": 229, 5 "brazil": 89, 6 "usa": 873, 7 "uk": 543, 8 "rossia": 24, 9 "kenya": 477 10} 11# items_sorted = sorted(dict, key=lambda x: x[1], reverse=True) 12items_sorted = sorted(dict, key=lambda country_name: dict[country_name], reverse=True) 13print(items_sorted) 14print("")

国名の 2 文字目を元にソートしています。

上の結果はどのようにソートされたものなのでしょうか?

以下のコードを実行すると雰囲気がつかめるかもしれません。

python

1dict = { 2 "japan": 115, 3 "china": 229, 4 "brazil": 89, 5 "usa": 873, 6 "uk": 543, 7 "rossia": 24, 8 "kenya": 477 9} 10 11for x in dict: 12 print(x[1], x)
>>> for x in dict: ... print(x[1], x) ... a japan h china r brazil s usa k uk o rossia e kenya >>>

投稿2020/04/24 02:41

nico25

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentooo

2020/04/24 03:08

for loopで回すとすごくわかりやすいですね。 keyの文字列のindexを指定しているとは思いませんでした。 ご教授いただき誠にありがとうございました。
nico25

2020/04/24 03:11

恐れいります!
guest

0

ベストアンサー

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 02:35

編集2020/04/24 02:39
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kentooo

2020/04/24 03:07

key関数がどのように動いているのか曖昧でしたのでよくわかりました。 丁寧にご回答いただき誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問