首页 > 解决方案 > 在嵌套字典和列表中递归

问题描述

这是我之前的一个问题的后续问题。我有一些字典,我需要查看它们包含的每个值,如果该值是日期时间,我需要以特定方式对其进行格式化。我还需要能够递归到嵌套字典和列表中。这是我到目前为止所拥有的:

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 层深度中的值。

建议将不胜感激。

谢谢!

标签: pythonpython-3.xnested

解决方案


您需要区分循环列表和字典

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)

推荐阅读