从Python列表中生成树

Jah*_*yst 2 python

我有以下Python列表:

[
  ['a.b.c.d.e.rollover', 0],
  ['a.b.c.d.e.f.rollover', 1],
  ['a.b.c.d.e.g.rollover', 0]
]
Run Code Online (Sandbox Code Playgroud)

假设这个列表非常大(很多元素!)

Python中是否有一种有效的方法将其转换为如下所示的多级字典?

{
  'a': {
     'b': {
        'c': {
           'd': {
              'e': {
                 'rollover': 0,
                 'f': {
                    'rollover': 1
                 }
                 'g': {
                    'rollover': 0
                 }
              }
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

nie*_*mmi 5

您可以使用defaultdict与使用相同的lambda返回:defaultdictlambda

from collections import defaultdict

l = [
  ['a.b.c.d.e.rollover', 0],
  ['a.b.c.d.e.f.rollover', 1],
  ['a.b.c.d.e.g.rollover', 0]
]

dd = lambda: defaultdict(dd)
res = dd()

for k, v in l:
    d = res
    keys = k.split('.')

    # Add all the keys except the last one, d[x] will do since 
    # it forces default value to be generated
    for x in keys[:-1]:
        d = d[x]

    # Assign value to last key
    d[keys[-1]] = v

print res['a']['b']['c']['d']['e']['rollover'] # 0
print res['a']['b']['c']['d']['e']['f']['rollover'] # 1
Run Code Online (Sandbox Code Playgroud)

简短说明:为了defaultdict在键不存在的情况下自动生成新的,我们需要一个lambda返回这样一个对象的函数(或).由于defaultdict构造函数需要一个参数,我们必须提供一个传递参数的函数defaultdict.每次取消引用不存在的键时defaultdict,都会调用该函数,并创建一个新的,如果需要,将来会再次调用相同的函数.这称为自动更新.