python - 在嵌套字典和列表中递归
问题描述
这是我之前的一个问题的后续问题。我有一些字典,我需要查看它们包含的每个值,如果该值是日期时间,我需要以特定方式对其进行格式化。我还需要能够递归到嵌套字典和列表中。这是我到目前为止所拥有的:
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)
推荐阅读
- arrays - Base.repeat 用于数值数组与 Base.kron
- flutter - Navigator.pop 颤动返回上一页时停止播放音频播放器
- javascript - 当我在引导标签输入上进行控制台登录时发出重复值
- python - 如何跳过python列表中的数字?
- c# - 如何在特定标记 XMLDocument C# 中的标记上使用 GetElementsByTagName
- r - R 中的 ARIMA 函数是否区分 xreg 变量?
- json - 机器人框架:尝试比较两个 json 文件的值
- spring-boot - Spring Boot 2 中的 camel-metrics - 通过 JConsole 在 MBeans 中看不到我的指标
- python - 类型错误:search() 缺少 1 个必需的位置参数:“名称”
- html - 下拉列表验证角度