如何将列表转换为层次字典

3

如何将一个列表 ["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)

谢谢!


注意,你的最后一个元素是一个* set *而不是dict - juanpa.arrivillaga
由于Python没有尾递归优化,您可能需要重构为非递归或正确处理输入长度过长而无法使用递归的情况。请参见https://dev59.com/NmYr5IYBdhLWcg3wi6zd - Novaterata
4个回答

7
一个递归解决方案
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:])}

导致
>>> dictify(["one","two","three","four"])
{'one': {'two': {'three': {'four': None}}}}

3

如果你想让结构看起来像下面这样

{'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)

好的,看到了。感谢您对此事的更新,我会更新我的帖子。 - Kulix
@CoryKramer 我认为陈述仍然有效:我预计OP没有打算将集合作为最后一个值。 - TemporalWolf

2
如果您更喜欢非递归解决方案:
def endeepen(lst):
    old = None
    for v in lst[::-1]:
        ret = {}
        ret[v] = old
        old = ret
    return ret

只需反向迭代列表,并将每个字典作为前一个元素的值:

>>> 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 可能会出现问题。

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'}}}}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接