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

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

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

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

Python

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

Q&A

解決済

2回答

12734閲覧

Pythonの辞書型で前から順番にキーと要素を取得する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/10/04 07:54

前提・実現したいこと

Pythonの辞書型で前から順番にキーと要素を取得しようとしています。
以下のようなことがしたいです。

python

1sampleD= {'いち':[1, 11,111], 'に':[2, 22,222], 'さん':[3, 33,333]} 2#出力 3{'いち':[1, 11,111]}

発生している問題・エラーメッセージ

以下の方法では辞書型では順番から取得できず、エラーになりました。
他の方法を探していますが、見つけられていない状態です。

--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-4-1d6a5e1f1342> in <module>() 1 sampleD= {'いち':[1, 11,111], 'に':[2, 22,222], 'さん':[3, 33,333]} ----> 2 sampleD.pop(0) KeyError: 0

該当のソースコード

python

1sampleD= {'いち':[1, 11,111], 'に':[2, 22,222], 'さん':[3, 33,333]} 2sampleD.pop(0)

試したこと

Python

1sample = [1,2,3,4] 2sample.pop(0) 31 4 5sampleD= {'いち':[1, 11,111], 'に':[2, 22,222], 'さん':[3, 33,333]} 6sampleD.pop('いち') 7sampleD= {'いち':[1, 11,111], 'に':[2, 22,222], 'さん':[3, 33,333]} 8sampleD.pop('いち') 9[1, 11, 111]

補足情報(FW/ツールのバージョンなど)

Python3.6

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

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

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

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

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

guest

回答2

0

CPython3.6 or Python3.7以降でのみ有効な方法。

python

1>>> sampleD= {'いち':[1, 11,111], 'に':[2, 22,222], 'さん':[3, 33,333]} 2>>> for key in sampleD: 3... print(key, sampleD[key]) 4... 5いち [1, 11, 111] 6[2, 22, 222] 7さん [3, 33, 333]

OrderedDictを使うのであれば、コンストラクタに[(key, value), ...]という形式のiterableを渡してあげれば良いでしょう。

python

1>>> from collections import OrderedDict 2>>> d = OrderedDict([('いち',[1, 11,111]), ('に',[2, 22,222]), ('さん',[3, 33,333])]) 3>>> d 4OrderedDict([('いち', [1, 11, 111]), ('に', [2, 22, 222]), ('さん', [3, 33, 333])]) 5>>> list(d.items()) 6[('いち', [1, 11, 111]), ('に', [2, 22, 222]), ('さん', [3, 33, 333])]

ただ、これって、おそらく一回items()を呼んで更にlist化しないと、indexでアクセスできないんですかね? 処理の目的によっては、計算コストを考慮して違う方法を使いたいところかも。

投稿2018/10/04 09:32

編集2018/10/04 09:32
hayataka2049

総合スコア30933

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

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

0

ベストアンサー

一般に辞書型は順序を保持しません。

Python3.7以降、あるいはCPython3.6以降なら可能ですが、
コードに意味を持たせるという観点でOrderedDictを使うことをお勧めします。

OrderedDictのメソッドpopitemを用いれば、FIFOあるいはLIFOで値のペアを取得できます。

Python

1>>> from collections import OrderedDict 2>>> 3>>> o_dct = OrderedDict(one=1, two=2, three=3) 4>>> o_dct.popitem() 5('three', 3) 6>>> 7>>> o_dct.popitem(last=False) 8('one', 1) 9>>> 10>>> o_dct 11OrderedDict([('two', 2)])

投稿2018/10/04 07:58

編集2018/10/04 08:01
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/10/04 08:01

回答ありがとうございます。 Python3.7ではどのようになるのでしょうか。
LouiS0616

2018/10/04 08:03

dict#itemsでタプルを引っぱり出して先頭要素を取得しても良いですが、 やはりコードの意味合いの観点(セマンティクス)で、OrderedDictを用いることをお勧めします。
退会済みユーザー

退会済みユーザー

2018/10/04 08:05

ありがとうございます。 数えられないほどのデータセットを扱っているので、キー値にマッチする順番を設定するのは難しいです。
LouiS0616

2018/10/04 08:07

OrderedDictの使い方を調べてください。 インスタンス生成時以外にも値を詰め込んでいく方法はいくらでもあります。 私の例示したコードでたまたまキーワード引数として与えているだけです。
quickquip

2018/10/04 09:13

横からすみません。「キー値にマッチする順番を設定するのは難しい」という文の意味がちょっとわからなかったのですが。
morinatsu

2018/10/04 13:38

もしかして、「キーがどんな値かの想定があり、その順番」ではなくて、「アルファベット順」みたいな意味で「前から順番」と仰っているのでしょうか。
退会済みユーザー

退会済みユーザー

2018/10/06 04:39

コメントに対する返信が遅れて申し訳ございません。 o_dct = OrderedDict(one=1, two=2, three=3) のように、辞書型を手動で定義するのは難しいということです。 動かしたいプログラムでは、辞書型のデータはそれまでの計算過程で作成されるので、 OrderedDict()関数の引数に取ればご回答いただいたコードで解決できるのでしょうか。
LouiS0616

2018/10/06 04:47

o_dct = OrderedDict() でインスタンスを生成し、あとは普通の辞書と同じように要素を与えていけば良いです。 繰り返しますが、たまたま私が出した例でキーワード引数を活用しているだけで、OrderedDictの値をセットする方法がそれしかないわけではありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問