所以我有一本充满了大量有用内容的词典。如果列表中的任何值为空,我想删除一个键(在没有键的情况下构建一个新的dict)。
字典:
>>>print(vaar123)
{'moo': 'cora', 'ham': ['', 'test'], 'bye': 2, 'pigeon': '', 'heloo': 1}
我可以删除带有空值的'pigeon'键,其中包含的内容为。
>>>dict((k, v) for k, v in vaar123.items() if v)
{'moo': 'cora', 'ham': ['', 'test'], 'heloo': 1, 'bye': 2}
但是尽可能地尝试,我似乎无法想出一个删除'ham'的方法,因为它的列表中有一个空值。
提前感谢任何建议, 弗兰克
信息:字典使用创建值(由管理员设置)构建,附加值通过用户输入添加到列表中。值对用作输出。在列表中使用单个值会产生不合需要的输出。
答案 0 :(得分:1)
此函数以递归方式检查Sized
Iterable
以查看它们是否为空,如果找到
from collections.abc import Sized, Iterable #If you're on Python >= 3.6,
#you can use collections.abc.Collection
def all_nonempty(v):
if isinstance(v, (Sized, Iterable)):
return v and (all(map(all_nonempty, v)) if not isinstance(v, str) else True)
#We do the check against str because 'a' is a sized iterable that
#contains 'a'. I don't think there's an abstract class for
#containers like that
return True
然后我们可以用它来取消字典
print({k: v for k, v in d.items() if all_nonempty(v)})
输出:
{'moo': 'cora', 'bye': 2, 'heloo': 1}
答案 1 :(得分:0)
也许是这样:
>>> d = {'moo': 'cora', 'ham': ['', 'test'], 'heloo': 1, 'bye': 2}
>>> {k:v for k,v in d.items() if not(isinstance(v,list) and len(v) > 0 and v[0] == '')}
{'heloo': 1, 'moo': 'cora', 'bye': 2}
或者只是:
>>> {k:v for k,v in d.items() if not(isinstance(v,list) and '' in v)}
{'heloo': 1, 'moo': 'cora', 'bye': 2}
第一个答案将删除值为 first 元素为''
的列表的项目。第二个将删除任何值''
出现在某处的列表。
答案 2 :(得分:0)
假设列表中的所有值都是字符串:
{k: v
for k, v in vaar123.items()
if (not hasattr(v, '__iter__')) or
(hasattr(v, '__iter__') and v and all(elem for elem in v))}
说明:保留不可迭代的值,因为它们不能为空(没有意义)。否则,如果值是可迭代的,如果它是空的或者它包含任何错误值(即,根据上述假设为空字符串),则丢弃它。