代码之家  ›  专栏  ›  技术社区  ›  relet

动态生成字典键[duplicate]

  •  9
  • relet  · 技术社区  · 14 年前

    使用深度嵌套的python dict,我希望能够在这样的数据结构中赋值:

      mydict[key][subkey][subkey2]="value"
    

    无需检查mydict[key]等是否实际设置为dict,例如使用

      if not key in mydict: mydict[key]={}
    

    <type 'dict'> ?

    3 回复  |  直到 7 年前
        1
  •  27
  •   John La Rooy    7 年前
    class D(dict):
        def __missing__(self, key):
            self[key] = D()
            return self[key]
    
    d = D()
    d['a']['b']['c'] = 3
    
        2
  •  13
  •   David Webb    14 年前

    您可以使用元组作为dict的键,这样就不必担心子字典了:

    mydict[(key,subkey,subkey2)] = "value"
    

    collections.defaultdict .

    对于两个级别,这很简单:

    >>> from collections import defaultdict
    >>> d = defaultdict(dict)
    >>> d['key']['subkey'] = 'value'
    >>> d['key']['subkey']
    'value'
    

    >>> d = defaultdict(lambda: defaultdict(dict))
    >>> d['key']['subkey']['subkey2'] = 'value'
    >>> d['key']['subkey']['subkey2']
    'value'
    

        3
  •  3
  •   I82Much    14 年前

    from collections import defaultdict
    d = defaultdict(lambda : defaultdict(int))
    >>> d['a']['b'] += 1
    >>> d
    defaultdict(<function <lambda> at 0x652f0>, {'a': defaultdict(<type 'int'>, {'b': 1})})
    >>> d['a']['b']
    1
    

    http://tumble.philadams.net/post/85269428/python-nested-defaultdicts

    必须使用lambdas来实现内部默认集合肯定不太好,但显然是必要的。