簡體   English   中英

如何解析復雜的嵌套字典並打印在 python 的嵌套字典中排序的所有鍵?

[英]How to parse complex nested dictionary and print all keys sorted within nested dictionary in python?

我有以下數據

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)

使用此代碼,我的 output 是- ['earth', 'earth_forecast', 'first_entry', 'first_messanger', 'galaxy', 'globe', 'secondary_messanger']

缺少 output - 'avg_temp', 'zip_code', 'city_name', 'forecast', 'day', 'temp'

問題:如何改進代碼以使 output 也包含缺失的關鍵元素?

您需要遞歸調用 function,因為它們不止一層:

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 get_all_keys(d):
    if isinstance(d, dict):
        yield from d.keys()
        yield from get_all_keys(list(d.values()))
    elif isinstance(d, list):
        for v in d:
            yield from get_all_keys(v)

ret = get_all_keys(a)
list(set(ret))

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM