簡體   English   中英

遞歸嵌套字典和列表

[英]Recursing in nested dictionaries and lists

這是我以前的問題之一的后續問題。 我有一些字典,需要查看它們包含的每個值,如果該值是日期時間,則需要以特定方式設置其格式。 我還需要能夠遞歸到嵌套的字典和列表中。 這是我到目前為止的內容:

def fix_time(in_time):
    out_time = '{}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}'.format(in_time.year, in_time.month, in_time.day, in_time.hour, in_time.minute, in_time.second)
    return out_time

def fix_recursive(dct):
    for key, value in dct.items():
        if isinstance(value, datetime.datetime):
            mydict[key] = fix_time(value)
        elif isinstance(value, dict):
            fix_recursive(value)    

mydict={
    'Field1':'Value1'
    'SomeDateField1':1516312413.729,
    'Field2':'Value2',
    'Field3': [
        {
           'Subfield3_1':'SubValue1',
           'SubDateField3_1':1516312413.729
        },
        {
           'Subfield3_2':'SubValue2',
           'SubDateField3_2':1516312413.729
        },
        {
           'Subfield3_3':'SubValue3',
           'SubDateField3_3':1516312413.729
        }
     ],
     'Field4': {
        'Subfield4_1':'SubValue1',
        'SubDateField4_1':1516312413.729
     }
}

fix_recursive(mydict)

這對字典和嵌套字典非常有用,但對列表則不那么有用。 因此,在上面的示例中,fix_recursive將糾正SomeDateField1和SubDateField4_1,但不能糾正SubDateField3_1,SubDateField3_2或SubDateField3_3。 另外,由於我不知道輸入之前會是什么樣子,因此我試圖創建一個函數,該函數可以獲取列出的嵌套3層或4層深度中的值。

和建議,將不勝感激。

謝謝!

您需要區分遍歷列表和字典

def fix_recursive(obj):

    if isinstance(obj, list):  # could replace with collections.abc.MutableSequence
        itr = enumerate(obj)
    elif isinstance(obj, dict):  # could replace with collections.abc.MutableMapping
        itr = obj.items()
    else:
        return  # don't iterate -- pass back up

    for key, value in itr:
        if isinstance(value, datetime.datetime):
            obj[key] = fix_time(value)
        else:
            fix_recursive(value)
  1. 流動您當前的路線,為遞歸功能添加列表支持。
  2. 為什么要使用fix_time進行序列化和反序列化? 使用JSON或pickle,無需轉換日期時間。

暫無
暫無

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

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