【问题标题】:Creating a nested dict out of a list with unknown length从长度未知的列表中创建嵌套字典
【发布时间】:2016-10-31 10:47:36
【问题描述】:

我正在尝试获取一个获取 3 个列表并将它们转换为嵌套字典的方法。

第一个和第二个列表可以有任何数量 > 0 的条目。 值列表始终有 len(firstlist) * len(secondlist) 条目。

例如:

givenlist1 = ["First", "Second"]
givenlist2 = ["A.B.D", "A.Y.Z", "A.B.E"]
Values = ["10", "2", "3", "4", "1", "3"]

应该返回这样的字典:

{'First': {'A': {'B': {'D': '10', 'E': '3'}, 'Y': {'Z': '2'}}},
 'Second': {'A': {'B': {'D': '4', 'E': '3'}, 'Y': {'Z': '1'}}}}

我对@9​​87654324@ 进行了很多尝试,但我不知道如何处理第二个列表中可变数量的条目。

【问题讨论】:

    标签: python list dictionary nested


    【解决方案1】:

    您可以使用itertools.product 获取givenlist1givenlist2 中条目的所需组合,并使用zip 将它们与values 中的对应项关联。然后,您需要 .split 来自 givenlist2 项目中的字母的单个字母键以获取嵌套键,并根据需要创建新的字典。

    from itertools import product
    from pprint import pprint
    
    givenlist1 = ["First", "Second"]
    givenlist2 = ["A.B.D", "A.Y.Z", "A.B.E"]
    values = ["10", "2", "3", "4", "1", "3"]
    
    result = {k1: {} for k1 in givenlist1}
    
    for (k1, k2), v in zip(product(givenlist1, givenlist2), values):
        d = result[k1]
        keys = k2.split('.')
        for k in keys[:-1]:
            d = d.setdefault(k, {})
        d[keys[-1]] = v
    
    pprint(result)
    

    输出

    {'First': {'A': {'B': {'D': '10', 'E': '3'}, 'Y': {'Z': '2'}}},
     'Second': {'A': {'B': {'D': '4', 'E': '3'}, 'Y': {'Z': '1'}}}}
    

    这是编写内部 for 循环的一种不太紧凑但可能更易读的方法:

    for k in keys[:-1]:
        if k not in d:
            d[k] = {}
        d = d[k]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 2021-11-20
      • 2021-04-19
      • 2018-01-16
      • 1970-01-01
      • 2020-10-22
      相关资源
      最近更新 更多