11

我想创建一个可以访问的字典:

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方法是什么?

请注意,我输入了本金..但我想要的是金额..所以如果所有三个键都在那里..将本金添加到之前的金额!

谢谢

4

5 回答 5

24

您可能要考虑使用defaultdict

例如:

json_dict = defaultdict(lambda: defaultdict(dict))

将创建s of defaultdicts (我知道..但它是正确的),要访问它,您可以简单地执行以下操作:defaultdictdict

json_dict['context']['name']['id'] = '42'

而不必诉诸于使用if...else来初始化。

于 2012-08-28T20:43:51.347 回答
7
from collections import defaultdict

d = defaultdict(lambda : defaultdict(dict))

d[id_1][id_2][id_3] = amount
于 2012-08-28T20:45:51.927 回答
5
>>> 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"}}}'
于 2012-08-28T20:50:01.717 回答
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 具有。

或者使用更简单的版本defaultdict(来自上面的 wiki 链接):

def auto_dict():
    return defaultdict(auto_dict)
于 2012-08-28T20:46:51.283 回答
0

也许你需要看看多维数组——例如在 numpy 中:

http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

于 2012-08-28T20:44:52.173 回答