Create and lookup 2D dictionary with multiple keys per value

天涯浪子 提交于 2020-01-02 04:53:32

问题


I think I want to make a 2D dictionary with multiple keys per value.

I know how to make a 2D dictionary using defaultdict:

from collections import defaultdict
2d_dict = defaultdict(dict)

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

And I know that using regular dictionaries you can make with multiple keys like:

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

But I want to do something like lookup by tuple-of-keys:

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

In the first dimension of dictionary I need ~25 keys per value. Is there a way to do this with defaultdict?

Even if there is a way to do it with dicts is this a reasonable way to make a simple multidimensional lookup table?


回答1:


Apart from 2d_dict being an invalid variable name (it starts with a digit), your existing solution already works:

>>> 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'}})

In fact, you don't even need the parentheses - Python will still recognise your key as a tuple:

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

... and, yes, it's a perfectly reasonable way to build a 2D+1D lookup table.

If you want to build a 3D lookup table using nested dicts instead of tuple keys, this works:

>>> 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'}})})


来源:https://stackoverflow.com/questions/13326042/create-and-lookup-2d-dictionary-with-multiple-keys-per-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!