【发布时间】:2020-06-09 04:18:52
【问题描述】:
在我问的一个类似问题的后面,如何在不同的嵌套级别上清理包含各种数据类型的字典:空值、空列表、空字典等,例如
{
"key":"value",
"key1": {},
"key2": [],
"key3": True,
"key4": False,
"key5": None,
"key6": [1,2,3],
"key7": {
"subkey": "subvalue"
},
"key8": {
"subdict": {
"subdictkey": "subdictvalue",
"subdictkey1": {},
"subdictkey2": [],
"subdictkey3": None
}
}
}
变成:
{
"key":"value",
"key3": True,
"key4": False,
"key6": [1,2,3],
"key7": {
"subkey": "subvalue"
},
"key8": {
"subdict": {
"subdictkey": "subdictvalue"
}
}
}
该解决方案应该适用于 n 级嵌套(不仅仅是 1 级)。显然我想避免嵌套循环(特别是当 n 可以等于 3 或 4 时),是扁平化结构的唯一解决方案吗?有没有更优雅的处理方式?
编辑: 基于@Ch3steR 的回答并解决我遇到的包含 null 的列表的问题,这是最终的工作函数:
def recur(n_dict,new_d={}):
global counter
for key,val in n_dict.items():
if val or isinstance(val,bool) or (isinstance(val,list) and any(elem is not None for elem in val)):
if (isinstance(val,list) and any(elem is None for elem in val)):
counter=counter+1
else:
new_d={**new_d,**{key:val}}
if isinstance(val,dict):
new_d[key]=recur(val)
return new_d
【问题讨论】:
-
你昨天问了同样的问题。 stackoverflow.com/questions/60381477/… 只需使用递归应用相同的逻辑即可。
-
我认为添加结构组件是一个足够大的变化,它需要另一个问题,我应该只更新前一个吗?
-
最好将上一个问题的解决方案合并到回答您当前的问题中。当您有 n 级嵌套字典时,请使用 Recursion.
-
您在该问题中接受的答案不是 pythonic。并检查
list,tuple,dict是否为空,请使用if data_structure而不是if len(data_structure)==0,就像您之前接受的答案中提出的那样。
标签: python json python-3.x dictionary recursion