【问题标题】:From list to tree representation从列表到树表示
【发布时间】:2014-04-09 18:33:03
【问题描述】:

您好,我有一个像这样的列表(在 Python 3 中):

lista=[ ['a','b','c','d'],['b','f','g'],['c','h','i'],['d'],['h'],['i'],['f'],['g']]

我正在尝试将它翻译成这样的嵌套列表

['a',['b',['f'],['g']],['c',['h'],['i']],['d']]]

就像这棵树:

              a
            / | \
          b   c  d
         /\   /\
       f  g   h i 

我想用这样的生成器

listb = [ lista[0][0]] + [x for x in lista[1:] ]

但我不知道如何递归地遍历整个列表。 谢谢!

【问题讨论】:

  • listb=[lista[0][0]]+[x for x in lista[1:]] 不是生成器,它只是一个列表理解
  • 您确定需要这个嵌套列表吗?对于此类任务,dict 似乎比嵌套列表更好的类型

标签: python list recursion tree generator


【解决方案1】:
def nodeinline(head, nodes):
    return [head] + [nodeinline(child, nodes) for child in nodes.get(head, [])]

def nodebyref_to_nodeinline(lst):
    head  = lst[0][0]
    nodes = {node[0]: node[1:] for node in lst}
    return nodeinline(head, nodes)

nodebyref_to_nodeinline([['a','b','c','d'],['b','f','g'],['c','h','i'],['d'],['h'],['i'],['f'],['g']])

给予

['a', ['b', ['f'], ['g']], ['c', ['h'], ['i']], ['d']]

【讨论】:

    【解决方案2】:

    我认为这应该适合你:

    lista=[ ['a','b','c','d'],['b','f','g'],['c','h','i'],['d'],['h'],['i'],['f'],['g']]
    
    def tree(root, d):
        return [root] + [tree(k, d) for k in d[root]]
    
    d = {i[0]: i[1:] for i in lista}
    
    root = 'a'
    print(tree(root, d))
    

    打印出来:

    ['a', ['b', ['f'], ['g']], ['c', ['h'], ['i']], ['d']]
    

    虽然我相信字典 (d) 本身可能会更好地为您服务。

    【讨论】:

    • 谢谢,所以最好使用字典 {'d': [], 'i': [], 'b': ['f', 'g'], 'a ':['b','c','d'],'c':['h','i'],'h':[],'f':[],'g':[] } 对于树结构?
    • 是的,我想是的。当然,这一切都取决于您的用例,但是您可以使用字典为您提供任何节点的子节点,并使用方便的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2012-04-11
    • 2019-04-23
    相关资源
    最近更新 更多