Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从列表的Python列表生成树_Python - Fatal编程技术网

从列表的Python列表生成树

从列表的Python列表生成树,python,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] ] 假设这个列表非常大(有很多元素!) Python中是否有一种有效的方法将其转换为如下所示的多级词典? { 'a': { 'b': { 'c': { 'd': { 'e': {

我有以下Python列表:

[
  ['a.b.c.d.e.rollover', 0],
  ['a.b.c.d.e.f.rollover', 1],
  ['a.b.c.d.e.g.rollover', 0]
]
假设这个列表非常大(有很多元素!)

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

{
  'a': {
     'b': {
        'c': {
           'd': {
              'e': {
                 'rollover': 0,
                 'f': {
                    'rollover': 1
                 }
                 'g': {
                    'rollover': 0
                 }
              }
            }
          }
        }
      }
    }
  }
}
您可以与
lambda
一起使用,它返回使用相同
lambda
defaultdict

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

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

以下格式是字符串还是列表?只是好奇,为什么?。真的,为什么?下面的格式是Python列表。关于为什么:为什么不?这是我的申请所必需的,这就是为什么。一些家庭作业或什么的?第一个内部列表的第一个元素是什么?仔细看。你要么错过了。用于逗号或引号。我能问一下lambda部分是做什么的吗?我从未见过这样的lambda构造。
lambda
只返回使用相同的
lambda
生成默认值的
defaultdict
。由于缺少的键默认为
dict
,它允许像
d['a']['b']['c']='foobar'
这样的赋值。a
lambda
只是简单地将函数定义为表达式。您可以使用
def dd():return defaultdict(dd)
并获得相同的结果。好的,所以在这种情况下,它可以用于自动激活。@OlivierCervello:是的,没错。有一个类似这样的Python示例。