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))}
解释:保留不可迭代的值,因为它们不能为空(没有意义)。否则,如果一个值是可迭代的,则在它为空或包含任何错误值(即根据上述假设为空字符串)时将其丢弃。
所以我有一本字典,里面有很多有用的东西。如果列表中的任何值为空,我想删除一个键(构建一个没有键的新字典)。
词典:
>>>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
以查看它们是否为空,如果找到
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))}
解释:保留不可迭代的值,因为它们不能为空(没有意义)。否则,如果一个值是可迭代的,则在它为空或包含任何错误值(即根据上述假设为空字符串)时将其丢弃。