Python3 如果列表中包含的值为空,则删除字典键

Python3 Removing dictionary key if value contained in list is blank

所以我有一本字典,里面有很多有用的东西。如果列表中的任何值为空,我想删除一个键(构建一个没有键的新字典)。

词典:

>>>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',因为它的列表中有一个空值。

在此先感谢您的任何建议, 弗兰克

信息:字典是用创建时的值构建的(由管理员设置),附加值由用户输入添加到列表中。值对用作输出。列表中只有一个值会产生不需要的输出。

大概是这样的:

>>> 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}

第一个答案将删除值为 第一个 元素为 '' 的列表的项目。第二个将删除列表中某处出现 '' 的任何值。

此函数递归检查 Sized Iterable 以查看它们是否为空,如果找到

则 returns 为假
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}

假设列表中的所有值都是字符串:

{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))}

解释:保留不可迭代的值,因为它们不能为空(没有意义)。否则,如果一个值是可迭代的,则在它为空或包含任何错误值(即根据上述假设为空字符串)时将其丢弃。