我有一个深度嵌套字典的字典,我正在尝试删除所有为 None 或 "" 的 k-v 对。下面的字典 d
是输入的一个例子。
d = {
"1": {
"1_1": 'a real value',
"1_2": ""
},
"2": None,
"3": {
"3_1": {
"3_2": None
}
}
}
通常,要删除字典中的空字段,命令 {k:v for k,v in d.items() if v}
可以完成这项工作。但在这种情况下,我想删除所有值为空或 null 的嵌套字典,我不知道如何执行此操作。有什么想法吗?
d
经过这个转换后,所有值为空的空字典都应该消失了。它应该是这样的:
{
"1": {
"1_1": 'a real value',
}
}
答案 0 :(得分:3)
您可以编写一个函数来递归删除空字典。例如:
def return_non_empty(my_dict):
temp_dict = {}
for k, v in my_dict.items():
if v:
if isinstance(v, dict):
return_dict = return_non_empty(v)
if return_dict:
temp_dict[k] = return_dict
else:
temp_dict[k] = v
return temp_dict
例如,如果 d
是:
d = {
"1": {
"1_1": 'a real value',
"1_2": ""
},
"2": None,
"3": {
"3_1": {
"3_2": None
}
}
}
然后我的自定义函数 return_non_empty
将返回:
>>> return_non_empty(d)
{'1': {'1_1': 'a real value'}}
答案 1 :(得分:1)
您可以将递归与字典理解结合使用:
d = {'1': {'1_1': 'a real value', '1_2': ''}, '2': None, '3': {'3_1': {'3_2': None}}}
def get_d(d):
return {a:c for a, b in d.items() if (c:=(b if not isinstance(b, dict) else get_d(b)))}
print(get_d(d))
输出:
{'1': {'1_1': 'a real value'}}
注意:此解决方案使用 Python 的赋值表达式 (:=
),可在 >= 3.8 版本中使用。对于不使用此范式的解决方案,请参阅@Anonymous 的回答。