我有一个dict { 'a': 'a', 'b': 0, 'c': {} }
,我需要省略所有具有空值的键(0不被视为空)。所以,这个输出应该是{ 'a': 'a', 'b': 0 }
。
{ 'a': 'a', 'b': 0, 'c': { 'd': 'd' } }
- > { 'a': 'a', 'b': 0, 'c': { 'd': 'd' } }
;
我尝试了类似{k: v for k,v in my_dict.items() if not v}
的内容,但我不确定如何保留0;
答案 0 :(得分:2)
您可以编写一个函数,根据值使用谓词进行过滤:
def omit_by(dct, predicate=lambda x: x!=0 and not x):
return {k: v for k, v in dct.items() if not predicate(v)}
dct = { 'a': 'a', 'b': 0, 'c': {} }
print(omit_by(dct))
# {'a': 'a', 'b': 0}
dct = {'a': 'a', 'b': 0, 'c': { 'd': 'd' } }
print(omit_by(dct))
# {'a': 'a', 'b': 0, 'c': {'d': 'd'}}
只需将谓词更改为适合您的内容。
答案 1 :(得分:1)
或许这样的事情?
res = { k:v for k,v in source_dict.items() if (hasattr(v, '__len__') and len(v) > 0) or isinstance(v, int) }
注意:您必须调整if ...
部分理解以满足您的需求。这里的条件适用于您在示例中显示的类型,但您必须根据需要添加条件(同样,根据您在密钥中使用的不同类型,条件可能会增长很多......)
答案 2 :(得分:0)
def purify(dict):
for k,v in dict:
if isinstance(v, list) or isinstance(v, set) or isinstance(v, dict):
if len(v) == 0:
del dict[k]
return dict
您可以这样使用它:dict = purify(src)
答案 3 :(得分:0)
为什么不定义一个函数来测试一个项目是否为空? ('空的'的定义可能非常适合我使用)
def not_empty(item):
'''
define what's empty
'''
if isinstance(item, (dict, list)) and (not item):
return False
if item is None:
return False
# add more situations?
return True
sample_dict = { 'a': 'a', 'b': 0, 'c': {} }
result = {k:v for k,v in sample_dict.items() if not_empty(v)}