解析词典中的词典

时间:2010-12-27 18:55:05

标签: python json dictionary

例如,我在字典中有这个Python字典,它是返回的JSON对象:

{
    u'BrowseNode': {
        u'Ancestors': {
            u'BrowseNode': {
                u'Ancestors': {
                    u'BrowseNode': {
                        u'Ancestors': {
                            u'BrowseNode': {
                                u'Ancestors': {
                                    u'BrowseNode': {
                                        u'BrowseNodeId': 283155,
                                        u'Name': u'Books'
                                    }
                                },
                                u'BrowseNodeId': 1000,
                                u'IsCategoryRoot': 1,
                                u'Name': u'Subjects'
                            }
                        },
                        u'BrowseNodeId': 75,
                        u'Name': u'Science'
                    }
                },
                u'BrowseNodeId': 14545,
                u'Name': u'Physics'
            }
        },
        u'BrowseNodeId': 226697,
        u'Name': u'Electromagnetism'
    }
}

我希望获得“Name”键值,但保留Python对象(不转换它或类似)

输出应该是这样的:

Books, Subjects, Science, Physics, Electromagnetism

由于

3 个答案:

答案 0 :(得分:2)

这样的东西也适用于给定的数据而且不是递归的:

def collect_names( node ):
    names = []
    while True:
        names.append(node[u'Name'])
        try:
            # deeper node
            node = node[u'Ancestors'][u'BrowseNode']
        except KeyError:
            # we are done, no ancestors 
            return names[::-1]

print collect_names(data[u'BrowseNode'])
# >> [u'Books', u'Subjects', u'Science', u'Physics', u'Electromagnetism']

答案 1 :(得分:1)

def print_name(d):
    name = d.get('Name')
    if name:
        print name
    ancestors = d.get('Ancestors')
    if ancestors:
        print_name(ancestors)

递归打印名称属性......

答案 2 :(得分:1)

Recursion的经典用例。

从头到尾:

  1. 编写一个以字典和列表作为参数的函数
  2. 在函数内部迭代所有字典的键
  3. 如果密钥是“名称”,则将值添加到列表
  4. 如果没有,并且键的类型值是字典,请调用该函数并传递此字典和名称为
  5. 的列表
  6. 在函数结束时只返回字典
  7. 要打电话给names = func(baseDict, [])