解析字典中的字典

0 投票
3 回答
3311 浏览
提问于 2025-04-16 09:05

举个例子,我有一个包含字典的字典,这个字典是一个返回的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 个回答

1

经典的递归用法。

我随便想的:

  1. 写一个函数,这个函数需要两个参数,一个是字典,另一个是列表。
  2. 在函数内部,遍历字典里的所有键。
  3. 如果这个键是“Name”,就把它的值加到列表里。
  4. 如果不是,而且这个键的值是一个字典,那就再次调用这个函数,把这个字典和包含名字的列表传进去。
  5. 最后,函数只需要返回这个字典。

要获取结果,可以调用 names = func(baseDict, [])

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

递归地打印名字属性……

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']

撰写回答