从未知长度的列表中创建嵌套的dict

时间:2016-10-31 10:47:37

标签: python list dictionary nested

我试图获得一个获取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'}}}}

我在.update尝试了很多但是我不知道如何在第二个列表中使用可变数量的条目来做这件事。

1 个答案:

答案 0 :(得分:1)

您可以使用itertools.product获取givenlist1givenlist2中所需条目的组合,并使用zip将其与{{1}中的相应项相关联}}。然后,您需要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