11

次のようにアクセスできるdictを作成したいと思います。

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の方法は何ですか?

プリンシパルを入力することに注意してください。ただし、必要なのは金額です。したがって、3つのキーがすべてある場合は、プリンシパルを前の金額に追加します。

ありがとう

4

5 に答える 5

24

あなたは使用を検討したいかもしれませんdefaultdict

例えば:

json_dict = defaultdict(lambda: defaultdict(dict))

sのsdefaultdictを作成します(私は知っていますが、それは正しいです)、それにアクセスするには、次のようにするだけです。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 に答える