如何将列表转换为层次结构dict

时间:2017-07-24 16:59:43

标签: python

如何将["one","two","three","four"]之类的列表转换为类似{"one": {"two": {"three":{"four"}}}}的列表,其中列表中的每个项目都是字典中其他元素的后代?我认为它可以在递归函数中完成,但我不确定如何。

这就是我的尝试:

l = ["one","two","three","four"]
d = {}

for v in l[:-1]:
    d[v] = {l}
    d = d[v]

print(d)

谢谢!

4 个答案:

答案 0 :(得分:5)

递归解决方案

JB_DISABLE_BUFFERING

例如

def dictify(d):
    if len(d) == 1:
        return {d[0]}
    else:
        return {d[0]: dictify(d[1:])}

请注意,在上面的解决方案中,最里面的对象实际上是>>> dictify(["one","two","three","four"]) {'one': {'two': {'three': {'four'}}}} ,而不是set。如果您希望所有对象都是dict,那么您可以将解决方案修改为

dict

导致

def dictify(d):
    if len(d) == 1:
        return {d[0]: None}
    else:
        return {d[0]: dictify(d[1:])}

答案 1 :(得分:2)

如果您希望结构如下所示

{'one': {'two': {'three': {'four': None}}}}

你可以用这样的东西生成它。此解决方案使用递归。

arr = ["one", "two", "three", "four"]


def gen(arr):
    if len(arr) == 0:
        return None
    else:
        key = arr.pop(0)
        val = gen(arr)

        dict = {}
        dict[key] = val
        return dict

print gen(arr)

答案 2 :(得分:2)

如果您不喜欢非递归解决方案:

def endeepen(lst):
    old = None
    for v in lst[::-1]:
        ret = {}
        ret[v] = old
        old = ret
    return ret

反向迭代列表并将每个dct作为前一个元素值隐藏:

>>> endeepen(l)
{'one': {'two': {'three': {'four': None}}}}

如果确实希望最后一个元素成为一个集合,您可以通过一个小的修正来实现:

def endeepen(lst):
    old = {lst[-1]}
    for v in lst[len(lst) - 2::-1]:
        ret = {}
        ret[v] = old
        old = ret
    return ret

然后给出:

>>> endeepen(l)
{'one': {'two': {'three': set(['four'])}}}

注意:在这两种情况下,我都没有覆盖边缘条件,因此空列表或非常短的列表len(1) <= 1可能会出错。

答案 3 :(得分:0)

l = ["one","two","three","four"]
d = {}

d2 = d
for v in l[:-1]:
    d2[v] = {}
    d2 = d2[v]
d2[l[-2]] = {l[-1]}
print(d)
>>> {'one': {'two': {'three': {'three': {'four'}}}}}