Python:优雅地删除字典中的空列表方法
我有一个字典,内容如下:
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字典中去掉空值,而不需要创建原字典的副本?
7 个回答
5
你可以使用字典推导式:
>>> default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
14
这个功能在内置库里没有(据我所知),不过你可以很简单地用字典推导式来实现:
new_dict = {k:v for k,v in original_dict.items() if v}
如果你用的是老版本的Python(2.7之前的版本,没有字典推导式),你可以使用字典构造函数:
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)
*当然,“最好”这个词是完全主观的。
9
要修正你的函数,把 del[k]
改成 del d[k]
。在字典中没有直接删除值的函数。
你现在做的是删除变量 k
,而不是改变字典的内容。这就是为什么原来的字典总是被返回的原因。
重新写的话,你的函数可能看起来像这样:
def remove_empty_keys(d):
for k in d.keys():
if not d[k]:
del d[k]
这段代码假设你想要删除空列表和 None
的值,实际上会删除任何“假”的值。