2012-11-10 138 views
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来做到这一点?

即使有一种方法可以做到这一点,这是一个合理的方式来做一个简单的多维查找表?

回答

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查找表一个完全合理的方式。

如果你想建立使用嵌套类型的字典,而不是元组密钥的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']'。 –

相关问题