2012-11-10 20 views
5

値ごとに複数のキーを持つ2次元辞書を作成したいと思います。値ごとに複数のキーを持つ2次元辞書

私はdefaultdictを使用して、2D辞書を作成する方法を知っている:

from collections import defaultdict 
2d_dict = defaultdict(dict) 

2d_dict['canned_food']['spam'] = 'delicious' 

そして、私は定期的に辞書を使用して、あなたが

dictionary={('food','canned_food'):spam} 

のような複数のキーを作ることができることを知っている。しかし、私のような何かをしたいです:

2d_dict[('canned_food','food')]['spam'] = 'delicious' 

辞書の第1次元では〜25が必要です値ごとのキー。 defaultdictでこれを行う方法はありますか?

dictsで行う方法があっても、これは単純な多次元ルックアップテーブルを作成するための合理的な方法ですか? 2d_dictから別に

答えて

11

は無効な変数名(それが数字で始まる)であること、既存のソリューションは、すでに動作します:実際に

>>> from collections import defaultdict 
>>> d2_dict = defaultdict(dict) 
>>> d2_dict[('canned_food', 'food')]['spam'] = 'delicious' 
>>> d2_dict 
defaultdict(<type 'dict'>, {('canned_food', 'food'): {'spam': 'delicious'}}) 

を、あなたも括弧を必要としない - Pythonはまだあなたを認識しますタプルとしてキー:

>>> d2_dict['fresh_food', 'food']['eggs'] = 'delicious' 
>>> d2_dict 
defaultdict(<type 'dict'>, {('canned_food', 'food'): {'spam': 'delicious'}, 
('fresh_food', 'food'): {'eggs': 'delicious'}}) 

...そして、はい、それは2D + 1次元ルックアップテーブルを構築するための完全に合理的な方法です。

あなたは、ネストされたdicts代わりのタプルキーを使用して3Dルックアップテーブルを構築したい場合は、これは動作します:

>>> d3_dict = defaultdict(lambda: defaultdict(dict)) 
>>> d3_dict['dried_food']['food']['jerky'] = 'chewy' 
>>> d3_dict 
defaultdict(<function <lambda> at 0x7f20af38a2a8>, 
{'dried_food': defaultdict(<type 'dict'>, {'food': {'jerky': 'chewy'}})}) 
+0

を私は明らかに(無効な変数名アウトで)の例を試してみました、ありがとうござい私が持っている必要がありますタイプミスがありました。ちょうどうまくいくが、あなたは正しい。 – Keith

+0

辞書にアクセスするにはどうすればいいですか?私は考えました: 'print d2_dict ['fresh_food'] ['eggs']'は美味しいものを印刷しますが、エラーが出ます。リストなしで辞書を使用するとうまく動作します。私はその辞書にアクセスするために何か特別なことをしなければならないのですか? – Keith

+0

'' fresh_food''はトップレベル辞書のキーではありません。 '( 'fresh_food'、 'food')'はです。だからあなたは 'print d2_dict ['fresh_food'、 'food'] ['eggs']'を使います。 –

関連する問題