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

Gia*_*ear 8 python dictionary list

我有一本字典:

default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
Run Code Online (Sandbox Code Playgroud)

我希望消除空值:

default = {'a': ['alpha'], 'b': ['beta','gamma']}
Run Code Online (Sandbox Code Playgroud)

我写了一个函数(按照网络上的一个例子)

def remove_empty_keys(d):
    for k in d.keys():
        try:
            if len(d[k]) < 1:
                del[k]
        except:
            pass
        return(d)
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

1-我没有找到错误,为什么它总是返回以下 -

remove_empty_keys(default)
 {'a': ['alpha'], 'b': ['beta'], 'g': []}
Run Code Online (Sandbox Code Playgroud)

2-是否有内置函数从Python字典中删除/删除Null/None/empty值而不创建原始字典的副本?

mgi*_*son 8

没有内置功能(AFAIK),但你可以通过词典理解轻松完成:

new_dict = {k:v for k,v in original_dict.items() if v}
Run Code Online (Sandbox Code Playgroud)

如果您遇到旧版本的python(2.7之前没有dict理解),您可以使用dict构造函数:

new_dict = dict((k,v) for k,v in original_dict.items() if v)
Run Code Online (Sandbox Code Playgroud)

请注意,这不会就位(根据您的第二个问题).字典不像列表那样支持切片分配,所以最好的*你可以真正做到这一切就是:

new_dict = {k:v for k,v in original_dict.items() if v}
original_dict.clear()
original_dict.update(new_dict)
Run Code Online (Sandbox Code Playgroud)

*当然,"最佳"一词完全是主观的.


Mic*_*ber 8

要修复您的功能,请更改del[k]del d[k].没有从字典中删除值的功能.

你正在做的是删除变量k,而不是更改字典.这就是返回原始字典的原因.

重写,您的功能可能如下所示:

def remove_empty_keys(d):
    for k in d.keys():
        if not d[k]:
            del d[k]
Run Code Online (Sandbox Code Playgroud)

这假设您要消除空列表和None值,并实际删除任何带有"false"值的项目.

  • 在 Python 2 中,迭代 `d.keys()`(它是一个列表)使得删除循环中的值成为可能。在 Python 3 中,`d.keys()` 是 [懒惰](https://docs.python.org/3/library/stdtypes.html#dict-views)。而是迭代`list(d)`,或者像[@mgilson's answer](/sf/answers/1036939641/)中那样构建一个新字典 (2认同)

Roh*_*ain 5

您可以使用dict理解:-

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

>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
Run Code Online (Sandbox Code Playgroud)