【问题标题】:How can I recursively add dictionaries in Python from JSON?如何从 JSON 递归地在 Python 中添加字典?
【发布时间】:2013-01-15 14:28:54
【问题描述】:

尊敬的 Stackoverflow 会员,

我有这个 JSON 数组,它由以下项目组成(基本上):

{
    {
        'Name': 'x',
        'Id': 'y',
        'Unsusedstuff' : 'unused',
        'Unsusedstuff2' : 'unused2',
        'Children': []
    },
    {   'Name' : 'xx',
        'Id': 'yy',
        'Unsusedstuff' : 'unused',
        'Unsusedstuff2' : 'unused2',
        'Children': [{
            'Name': 'xyx',
            'Id' : 'yxy',
            'Unsusedstuff' : 'unused',
            'Unsusedstuff2' : 'unused2',
            'Children: []
        }

你得到了基本的想法。我想使用以下代码在 Python 列表中模拟这个(并且只获取 id 和名称和结构):

names = []
def parseNames(col):
    for x in col:
        if(len(x['Children'])> 0):
            names.append({'Name' : x['Name'], 'Id' : x['Id'], 'Children' : parseNames(x['Children'])})
        else:
            return {'Name' : x['Name'], 'Id' : x['Id']}

但是,它似乎只返回第一个“根”和第一个嵌套文件夹,但并没有遍历它们。

我该如何解决这个问题?

您好,

垫子

【问题讨论】:

    标签: python json recursion dictionary


    【解决方案1】:

    检查一下

    def parseNames(col):
        for x in col:
            if(len(x['Children'])> 0):
                a = [{
                    'Name' : x['Name'],
                    'Id' : x['Id'],
                    'Children' : x['Children'][0]['Children']
                    }]
                parseNames(a)
            names.append({'Name' : x['Name'], 'Id' : x['Id']})
        return names
    

    我得到的输出是

    [{'Name': 'x', 'Id': 'y'}, {'Name': 'xx', 'Id': 'yy'}, {'Name': 'xx', 'Id': 'yy'}]
    

    【讨论】:

    • 这似乎无法解决问题。显然,结果相同。
    • 非常感谢!这似乎让我更进一步。然而,孩子们被添加为: 而不是他们的节点。它是如何工作的?
    • 没问题!现在似乎给了我一些奇怪的错误,例如:TypeError: string indices must be integers, not str.
    • 刚刚做了,好像比以前少了很多。我们一定在这里遗漏了一些东西。我不知道。
    【解决方案2】:

    按照我的阅读方式,您正在尝试将这棵树转换为只有 Id、Name 和 Children 的节点树。在这种情况下,我认为它是清洁节点。

    清理节点:

    1. 使用原始节点的名称和 ID 创建一个节点。
    2. 将新节点的子节点设置为原始节点子节点的清理版本。 (这是递归调用。)

    在代码中,应该是:

    def clean_node(node):
        return {
            'Name': node['Name'],
            'Id': node['Id'],
            'Children': map(clean_node, node['Children']),
        }
    
    >>> print map(clean_node, data)
    [{'Name': 'x', 'Children': [], 'Id': 'y'}, {'Name': 'xx', 'Children': [{'Name': 'xyx', 'Children': [], 'Id': 'yxy'}], 'Id': 'yy'}]
    

    我发现像这样分解递归问题更容易 - 尝试使用全局变量会使简单的事情很快变得非常混乱。

    【讨论】:

      【解决方案3】:

      你可以用这个来解析一个 Json 对象:

      import json
      response = json.loads(my_string)
      

      现在response 是一个字典,其中包含每个 Json 对象的键。

      【讨论】:

      • 我想了这么多。这已经是 json.loads() 调用的结果(因为我能够执行 x['Name'])。编辑了原始帖子以澄清这一点
      • 你应该使用while child in x['Children']而不是len函数。
      猜你喜欢
      • 2014-12-07
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2018-08-01
      • 1970-01-01
      • 2017-11-04
      • 2013-03-13
      相关资源
      最近更新 更多