[英]Python: An elegant way to delete empty lists from Python dictionary
我有一本字典:
default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
我希望消除空值:
default = {'a': ['alpha'], 'b': ['beta','gamma']}
我写了一个函数(按照网上的一个例子)
def remove_empty_keys(d):
for k in d.keys():
try:
if len(d[k]) < 1:
del[k]
except:
pass
return(d)
我有以下问题:
1-我没有发现为什么它总是返回以下错误-
remove_empty_keys(default)
{'a': ['alpha'], 'b': ['beta'], 'g': []}
2- 是否有内置函数可以在不创建原始字典副本的情况下从 Python 字典中消除/删除 Null/None/空值?
没有内置的(AFAIK),但是您可以使用字典理解轻松完成:
new_dict = {k:v for k,v in original_dict.items() if v}
如果您坚持使用旧版本的 python(2.7 之前没有 dict 推导式),您可以使用 dict 构造函数:
new_dict = dict((k,v) for k,v in original_dict.items() if v)
请注意,这不会就地运行(根据您的第二个问题)。 并且字典不支持像列表那样的切片分配,所以你真正能做的最好的事情是:
new_dict = {k:v for k,v in original_dict.items() if v}
original_dict.clear()
original_dict.update(new_dict)
*当然,“最佳”一词完全是主观的。
要修复您的函数,请将del[k]
更改为del d[k]
。 没有从字典中删除值的功能。
您正在做的是删除变量k
,根本不更改字典。 这就是为什么总是返回原始字典的原因。
重写后,您的函数可能如下所示:
def remove_empty_keys(d):
for k in d.keys():
if not d[k]:
del d[k]
这假设您要消除空列表和None
值,并且实际上删除具有“false”值的任何项目。
您可以使用字典理解: -
>>> default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
dict((k, v) for k, v in default.iteritems() if v)
这将过滤所有非空字符串、空字典/元组/列表的项目。
另一个选项如下(不创建新字典):
for e in [k for k,v in default.iteritems() if len(v) == 0]: default.pop(e)
迈克尔的回答是正确的。
退后一步,您可以通过使用collections.defaultdict(list)
根本避免创建那些空列表
>>> import collections
>>> d = collections.defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> d["hobbits"].append("Frodo")
>>> d["hobbits"].append("Sam")
>>> d
defaultdict(<type 'list'>, {'hobbits': ['Frodo', 'Sam']})
如果值都是列表,那么你可以使用它们的真实性,你可以使用itertools.compress
:
from itertools import compress
d = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
new_d = dict(compress(d.items(), d.values()))
print(new_d) # {'a': ['alpha'], 'b': ['beta', 'gamma']}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.