Python:从Python字典中删除空列表的优雅方法

时间:2013-02-11 13:52:33

标签: python list 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 / empty值而不创建原始字典的副本?

7 个答案:

答案 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']}