如何删除深度未知的深度嵌套字典中的空字段或无字段?

时间:2021-01-28 20:19:26

标签: python dictionary recursion

我有一个深度嵌套字典的字典,我正在尝试删除所有为 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',
    }
}

2 个答案:

答案 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 的回答。

相关问题