使用返回新字典的递归函数:
def clean_empty(d):
if not isinstance(d, (dict, list)):
return d
if isinstance(d, list):
return [v for v in (clean_empty(v) for v in d) if v]
return {k: v for k, v in ((k, clean_empty(v)) for k, v in d.items()) if v}
{..}构造是字典理解;如果v为真,它将仅包括来自原始字典的密钥,例如,不是空的.类似地,[..]构造构建一个列表.
嵌套(.. for ..)构造是生成器表达式,允许代码在递归后紧凑地过滤空对象.
请注意,任何设置为数字0(整数0,浮点数0.0)的值也将被清除.如果v或v == 0,则可以保留数字0值.
演示:
>>> sample = {
... "fruit": [
... {"apple": 1},
... {"banana": None}
... ],
... "veg": [],
... "result": {
... "apple": 1,
... "banana": None
... }
... }
>>> def clean_empty(d):
... if not isinstance(d, (dict, list)):
... return d
... if isinstance(d, list):
... return [v for v in (clean_empty(v) for v in d) if v]
... return {k: v for k, v in ((k, clean_empty(v)) for k, v in d.items()) if v}
...
>>> clean_empty(sample)
{'fruit': [{'apple': 1}], 'result': {'apple': 1}}