【问题标题】:Python: Recursively extract comment tree from nested dicts and listsPython:从嵌套的字典和列表中递归提取评论树
【发布时间】:2020-01-26 23:07:39
【问题描述】:

我正在尝试从由嵌套字典和列表组成的数据结构中提取一系列 cmets。贝娄是我正在处理的内容以及我到目前为止所写内容的一个示例:

example = {"text" : "Level 0", 
                "children" : [{"text": "Level 1",
                                "children" : [{"text": "Level 2a"}, 
                                              {"text": "Level 2b"}]}] }


def parse_comments(comment_tree): 

    if isinstance(comment_tree, list): 
        for tree in comment_tree: 
            return parse_comments(tree)
    if isinstance(comment_tree, dict): 
        if "children" in comment_tree.keys(): 
            return comment_tree["text"], parse_comments(comment_tree["children"])
        else: 
            return comment_tree["text"]

理想情况下,输出应如下所示:

[["Level 0", "Level 1", "Level 2a"], ["Level 0", "Level 1", "Level 2b"]]

我目前得到这个:

('Level 0', ('Level 1', 'Level 2a'))

有什么建议吗?

【问题讨论】:

    标签: python recursion


    【解决方案1】:

    您可以将递归与生成器一起使用:

    example = {"text" : "Level 0", "children" : [{"text": "Level 1","children" : [{"text": "Level 2a"}, {"text": "Level 2b"}]}] }
    def get_comments(d, c = []):
      if 'children' not in d:
          yield c+[d['text']]
      else:
          for i in d['children']:
             yield from get_comments(i, c+[d['text']])
    
    print(list(get_comments(example)))
    

    输出:

    [['Level 0', 'Level 1', 'Level 2a'], ['Level 0', 'Level 1', 'Level 2b']]
    

    【讨论】:

    • 但是,请注意可变的默认参数。
    • @schwobaseggl 好点,虽然在这种情况下它不应该是问题,因为它没有附加任何值。
    • 感谢您这么快的回复。
    • 是的,无论如何都不是函数本身。不过,不应该向没有免责声明的初学者推荐它。
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多