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

时间:2017-01-05 18:20:05

标签: list python-3.x dictionary empty-list

所以我有一本充满了大量有用内容的词典。如果列表中的任何值为空,我想删除一个键(在没有键的情况下构建一个新的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'的方法,因为它的列表中有一个空值。

提前感谢任何建议, 弗兰克

信息:字典使用创建值(由管理员设置)构建,附加值通过用户输入添加到列表中。值对用作输出。在列表中使用单个值会产生不合需要的输出。

3 个答案:

答案 0 :(得分:1)

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

,则返回False
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))}

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