5

値ごとに複数のキーを持つ 2D 辞書を作成したいと考えています。

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

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'

辞書の最初の次元では、値ごとに最大 25 個のキーが必要です。これを行う方法はありdefaultdictますか?

辞書でそれを行う方法があったとしても、これは単純な多次元ルックアップテーブルを作成する合理的な方法ですか?

4

1 に答える 1

11

2d_dict無効な変数名 (数字で始まる) であることを除けば、既存のソリューションは既に機能しています。

>>> 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+1D ルックアップ テーブルを構築するための完全に合理的な方法です。

タプル キーの代わりにネストされた dict を使用して 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'}})})
于 2012-11-10T21:27:47.523 に答える