我有一本字典:
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 / empty值而不创建原始字典的副本?
答案 0 :(得分:8)
要修复您的功能,请将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”值的项目。
答案 1 :(得分:7)
没有内置功能(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)
*当然,“最佳”一词完全是主观的。
答案 2 :(得分:4)
你可以使用dict理解: -
>>> default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
答案 3 :(得分:4)
dict((k, v) for k, v in default.iteritems() if v)
这会过滤所有非空字符串的项目,空dict / tuple / list。
答案 4 :(得分:1)
Michael's answer是正确的。
退一步,您可以使用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']})
答案 5 :(得分:1)
还有一个选项是(不创建新的词典):
for e in [k for k,v in default.iteritems() if len(v) == 0]: default.pop(e)
答案 6 :(得分:0)
如果值都是列表,那么你可以使用它们的真实值,你可以使用 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']}