我想我想制作一个每个值有多个键的二维字典。
我知道如何使用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
?
即使有办法用dicts这样做,这是一个合理的方法来制作一个简单的多维查找表吗?
答案 0 :(得分: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查找表的完美合理方法。
如果你想使用嵌套dicts而不是tuple键来构建一个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'}})})