10

我有一本字典:

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/空值?

4

7 回答 7

12

没有内置的(AFAIK),但你可以通过 dict 理解轻松地做到这一点:

new_dict = {k:v for k,v in original_dict.items() if v}

如果你被旧版本的python(没有dict理解的pre 2.7)困住,你可以使用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)

*当然,“最佳”一词完全是主观的。

于 2013-02-11T13:54:00.643 回答
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值,并实际删除任何具有“假”值的项目。

于 2013-02-11T13:59:24.490 回答
5

您可以使用 dict 理解:-

>>> default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}

>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
于 2013-02-11T13:56:13.650 回答
4
dict((k, v) for k, v in default.iteritems() if v)

这会过滤所有非空字符串、空字典/元组/列表的项目。

于 2013-02-11T13:57:28.487 回答
2

另一个选项如下(不创建新字典):

for e in [k for k,v in default.iteritems() if len(v) == 0]: default.pop(e)
于 2013-03-04T15:07:29.280 回答
1

迈克尔的回答是正确的。

退后一步,您也许可以完全避免创建那些空列表,方法是使用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']})
于 2013-02-11T14:22:57.123 回答
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']}
于 2021-01-20T11:57:23.920 回答