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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

10913閲覧

pythonの辞書型について

waya

総合スコア20

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/05/25 03:13

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ページで確認できます。

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

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

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

Lhankor_Mhy

2017/05/25 03:32

Pythonの辞書は順序を保存しないと記憶しています。
guest

回答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

can110

総合スコア38266

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

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

waya

2017/05/25 07:09

ご回答ありがとうございます. 順序付き辞書を使えば良いのですね, pythonをつまみ食いして練習したもので穴がたくさん空いているようなので頑張って書きながら覚えていきます。
退会済みユーザー

退会済みユーザー

2017/05/25 07:51

自分の環境だといつからか辞書が順序を保障してくれるようになっていて(恐らくpython3.6環境から?)、順序を記憶しないのは昔の事だと思って居のですが違うのでしょうか b = {} b["勇者"] = {"HP":100, "攻撃力":50, "防御":30, "素早さ":20, "賢さ":15} b["賢者"] = {"HP":70 , "攻撃力":30, "防御":20, "素早さ":15, "賢さ":55} b["剣士"] = {"HP":110, "攻撃力":75, "防御":40, "素早さ":25, "賢さ":5} for key,value in b.items(): print(key) for i in list(value.keys()): print(i) 例えばこのコードでしたら私の環境だと、必ず同じ順序(追加した順序)で表示されます
退会済みユーザー

退会済みユーザー

2017/05/25 07:54

ああ すいませんインデントずれるの忘れてました>< 回答の方に書いておきます
can110

2017/05/25 07:58

数か月前にその手の話題がteratailにも挙がっていたような記憶がかすかにあります。 どの質問だったか思い出せませんが。。。
can110

2017/05/25 08:04

ありがとうございます!それです。 改めて読み返してみましたが > Pythonの言語仕様は変わっていないので、dictキーを挿入順で維持するかどうかはPython実装に依存している ということなので、順序を保証したい場合はOrderedDictを利用すべきと私は理解しています。
退会済みユーザー

退会済みユーザー

2017/05/25 08:26

勉強になります。 自分には少し難しいですが 要は環境変数依存?で順序付辞書を使うのが安定という事でいいんですかね お二人方付き合ってくださってありがとうございます><
can110

2017/05/25 08:32

私も流し読みでの把握にとどまってますがw、ようは実行環境(CPython)依存ですね。 なのでそれ以外の実行環境も考慮するならOrderedDictを利用すべきだと思います。
waya

2017/05/29 02:54

ご丁寧にありがとうございました. みなさんのコメントが非常に参考になりました.
guest

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

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

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

can110

2017/05/25 08:08

コメントありがとうございます。 あちらでLhankor_Mhyさんに情報提供いただきました。過去に同様の質問あり(https://teratail.com/questions/69286)実装依存のようです。
退会済みユーザー

退会済みユーザー

2017/05/25 08:27

ご丁寧にありがとうございます><
guest

0

そもそも
Pythonの辞書(dict)では、keyを登録した順番は記憶されませんということで、ご提示のプログラムでは、new_dicは御期待の内容では無いのでは?と思うのですが・・・・

それは置いておくとすると、

python

1new_dic=dict(sorted(original_dic.items()))

とすれば、御提示のプログラムと同様の動作になるかと思います。

投稿2017/05/25 03:40

hiro-k

総合スコア902

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

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

waya

2017/05/25 07:08

なるほど,辞書型で順番が記憶されないということを完全に忘れておりました...。 勉強不足でお恥ずかしいです。 ありがとうございます.無事できました.
hiro-k

2017/05/29 01:30

私も知らなかったのですが、Python3.6?では実装依存で保存されるようですね。 そうであっても、仕様を理解してその範囲内でプログラムを書くくせをつけておくことは大切なことかと思います。
waya

2017/05/29 02:53

ご回答ありがとうございます. 少し気持ちを引き締めてこれがら頑張ります.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問