pythonの辞書型をソートした際に,スマートに新しく定義できる方法はないでしょうか?
例えば今までソートしたものを以下のように新しい辞書型に移し変えていました.
python
1new_dic = {} 2for key,item in sorted(original_dic.items()): 3 new_dic[key] = item
元の辞書型をsorted関数に引数として入れるだけでは返り値にソートした値を返すだけだと思うのですが,他にもっとスマートな方法はあるでしょうか?
仮にソートしたものを以下のように新しい変数に定義するとエラーが出てしまいます.
python
1new_dic = sorted(original_dic.items())
エラーは以下のように出てきます
AttributeError: 'list' object has no attribute 'values'
ご回答よろしくお願いします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
すでに回答あるとおり、dict
は格納されたkey,valueの順序を保証しませんし、ソートした結果を新しい辞書に格納しても同じことです。
順序を保持したい場合は順序付き辞書 (ordered dictionary) を利用します。
Python
1from collections import OrderedDict 2original_dic = {3:"three",2:"two",1:"one"} 3 4# t[0]=key順にsortしてその順に追加(構築)。OrderedDictは追加順を保持する。 5new_dic = OrderedDict(sorted(original_dic.items(), key=lambda t: t[0])) 6print(type(new_dic)) # <class 'collections.OrderedDict'> 7 8for key,item in new_dic.items(): 9 print(key,item)
投稿2017/05/25 04:40
総合スコア38262
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/25 07:09
退会済みユーザー
2017/05/25 07:51
退会済みユーザー
2017/05/25 07:54
2017/05/25 07:58
2017/05/25 07:59
2017/05/25 08:04
退会済みユーザー
2017/05/25 08:26
2017/05/25 08:32
2017/05/29 02:54
0
※これは回答ではありません
コメントに書くとインデントがずれる為こちらに書かせて頂きます
自分の環境だといつからか辞書が順序を保障してくれるようになっていて(恐らくpython3.6環境から?)、順序を記憶しないのは昔の事だと思って居のですが違うのでしょうか
python
1b = {} 2 3b["勇者"] = {"HP":100, "攻撃力":50, "防御":30, "素早さ":20, "賢さ":15} 4b["賢者"] = {"HP":70 , "攻撃力":30, "防御":20, "素早さ":15, "賢さ":55} 5b["剣士"] = {"HP":110, "攻撃力":75, "防御":40, "素早さ":25, "賢さ":5} 6 7for key,value in b.items(): 8 print(key) 9 for i in list(value.keys()): 10 print(i)
python
1b = { 2"勇者":{"HP":100, "攻撃力":50, "防御":30, "素早さ":20, "賢さ":15}, 3"賢者":{"HP":70 , "攻撃力":30, "防御":20, "素早さ":15, "賢さ":55}, 4"剣士":{"HP":110, "攻撃力":75, "防御":40, "素早さ":25, "賢さ":5}, 5} 6 7for key,value in b.items(): 8 print(key) 9 for i in list(value.keys()): 10 print(i) 11
例えばこれらのコードでしたら私の環境だと、必ず同じ順序(追加した順序)で表示されます。
投稿2017/05/25 07:59
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/25 08:08
退会済みユーザー
2017/05/25 08:27
0
そもそも
Pythonの辞書(dict)では、keyを登録した順番は記憶されませんということで、ご提示のプログラムでは、new_dicは御期待の内容では無いのでは?と思うのですが・・・・
それは置いておくとすると、
python
1new_dic=dict(sorted(original_dic.items()))
とすれば、御提示のプログラムと同様の動作になるかと思います。
投稿2017/05/25 03:40
総合スコア902
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。