我想创建一个可以访问的字典:
d[id_1][id_2][id_3] = amount
截至目前,我有一个非常丑陋的功能:
def parse_dict(id1,id2,id3,principal, data_dict):
if data_dict.has_key(id1):
values = data_dict[id1]
if values.has_key[id2]
..
else:
inner_inner_dict = {}
# and so on
这样做的pythonic方式是什么?
请注意,我输入了本金..但我想要的是金额.. 因此,如果所有三个键都在那里..将主体添加到之前的数量!
由于
答案 0 :(得分:17)
您可能需要考虑使用defaultdict
:
例如:
json_dict = defaultdict(lambda: defaultdict(dict))
将创建defaultdict
defaultdict
个dict
s {我知道..但它是对的),要访问它,您只需执行以下操作:
json_dict['context']['name']['id'] = '42'
无需使用if...else
初始化。
答案 1 :(得分:5)
from collections import defaultdict
d = defaultdict(lambda : defaultdict(dict))
d[id_1][id_2][id_3] = amount
答案 2 :(得分:4)
您可以创建一个创建新词典的简单词典(使用Autovivification):
>>> class AutoDict(dict):
def __missing__(self, key):
x = AutoDict()
self[key] = x
return x
>>> d = AutoDict()
>>> d[1][2][3] = 4
>>> d
{1: {2: {3: 4}}}
这将没有尺寸限制,因为dict的默认指令有。
使用defaultdict
的简单版本(来自上面的wiki链接):
def auto_dict():
return defaultdict(auto_dict)
答案 3 :(得分:4)
>>> from collections import defaultdict
>>> import json
>>> def tree(): return defaultdict(tree)
>>> t = tree()
>>> t['a']['b']['c'] = 'foo'
>>> t['a']['b']['d'] = 'bar'
>>> json.dumps(t)
'{"a": {"b": {"c": "foo", "d": "bar"}}}'
答案 4 :(得分:0)
也许您需要查看多维数组 - 例如在numpy中:
http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html