【问题标题】:How to transform a list into a hierarchy dict如何将列表转换为层次结构字典
【发布时间】:2017-07-25 01:18:28
【问题描述】:

如何将["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
  • 由于python没有尾调用优化,当输入的长度太长而无法递归时,您可能希望重构为非递归或正确处理。见stackoverflow.com/questions/13591970/…

标签: python


【解决方案1】:

递归解决方案

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

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 是的,看到了。感谢您对此的更新,我会更新我的帖子。
    • @CoryKramer 我认为该声明仍然有效:我希望 OP 不打算将集合作为最后一个值。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      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'}}}}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多