如何在python中解析复杂的嵌套字典并打印嵌套字典中排序的所有键?

如何在python中解析复杂的嵌套字典并打印嵌套字典中排序的所有键?,python,Python,我有以下数据 a = {'globe': {'first_entry': 0, 'first_messanger': 100, 'galaxy': 7}, 'earth': {'secondary_messanger': 9, 'earth_forecast': {'avg_temp': 60, 'z

我有以下数据

a = {'globe': {'first_entry': 0,
                     'first_messanger': 100,
                     'galaxy': 7},
 'earth': {'secondary_messanger': 9,
                 'earth_forecast': {'avg_temp': 60,
                                       'zip_code': 10001,
                                       'city_name': 'New York',
                                       'forecast': [{'day': 'Monday',
                                                           'temp': '70'},
                                                          {'day': 'Tuesday',
                                                           'temp': '71'},
                                                          {'day': 'Wednesday',
                                                           'temp': '60'}]}}}
我试过使用代码

def parsingvalue(b):

    lst = []
    for key, value in b.items():
        if isinstance(value, dict):
            tmp = value.keys()
            for i in tmp:
                lst.append(i)
        lst.append (key)
    print (sorted(lst))

parsingvalue (a)
使用此代码,我的输出是-
['earth','earth\u forecast','first\u entry','first\u messanger','galaxy','globe','secondary\u messanger']

输出丢失-
'avg\u temp','zip\u code','city\u name','forecast','day','temp'


问题:如何改进代码,使输出也包含缺少的关键元素?

您需要递归调用函数,因为它们是多个层:

def get_all_keys(d, res=None):
    if res is None:
        res = []
    for k in d:
        res.append(k)
        if isinstance(d[k], dict):
            get_all_keys(d[k], res)
        if isinstance(d[k], list):
            for i in d[k]:
                if isinstance(i, dict):
                    get_all_keys(i, res)
    return res

ret = get_all_keys(a)
list(set(ret))
给出:

['forecast',
 'secondary_messanger',
 'first_entry',
 'zip_code',
 'day',
 'galaxy',
 'first_messanger',
 'temp',
 'earth',
 'globe',
 'city_name',
 'avg_temp',
 'earth_forecast']

几乎与@z-li获得递归技巧的解决方案相同,但只对dict实例进行了一次测试,使用生成器而不是传递列表,并且更健壮,因为它不假设输入是dict:

def获取所有密钥(d):
如果存在(d,dict):
d.keys()的收益率
从get_all_键(列表(d.values())获得的收益
elif isinstance(d,列表):
对于d中的v:
获取所有密钥的收益(v)

ret=获取所有密钥(a)
列表(集合(ret))
给予


@李智-非常感谢。这很好用。
['first_messanger', 'secondary_messanger', 'galaxy', 'earth_forecast', 'globe', 'forecast', 'day', 'zip_code', 'avg_temp', 'city_name', 'temp', 'earth', 'first_entry']