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

Python:从Python字典中删除空列表的优雅方法,python,list,dictionary,Python,List,Dictionary,我有一本字典: default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []} 我希望消除空值,如下所示: default = {'a': ['alpha'], 'b': ['beta','gamma']} 我编写了一个函数(遵循web上的一个示例) 2-是否有一个内置函数可以在不创建原始字典副本的情况下从Python字典中消除/删除Null/None/empty值?没有内置函数(AFAIK),但您可以通过dict理解轻松做到这一点: n

我有一本字典:

default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}
我希望消除空值,如下所示:

default = {'a': ['alpha'], 'b': ['beta','gamma']}
我编写了一个函数(遵循web上的一个示例)


2-是否有一个内置函数可以在不创建原始字典副本的情况下从Python字典中消除/删除Null/None/empty值?

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

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)

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

你可以使用听写理解:-

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

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

这将过滤所有不是空字符串、空dict/tuple/list的项。

要修复函数,请将
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”值的项

是正确的

退一步说,通过使用

导入集合 >>>d=集合.defaultdict(列表) >>>d defaultdict(,{}) >>>d[“霍比特人”]。附加(“佛罗多”) >>>d[“哈比人”]。附加(“山姆”) >>>d defaultdict(,{'hobbits':['Frodo','Sam']})
还有一个选项如下(无需创建新的dict):


如果这些值都是列表,那么您可以使用它们的真值,您可以使用:


问题不是在迭代时修改dict——我实际上认为这可能没问题(尽管不要引用我的话)。就是OP在做
del[k]
而不是
deld[k]
。在我看来,第一个表单是创建一个列表,然后删除它(虽然我可能错了,因为
del
是一个语句…@mgilson。是的,我刚刚注意到了。我将删除这一行。你的问题似乎将
None
的概念与空列表混在一起。这使它更难理解。也许更好的说法是“是否有从字典中消除虚假值的功能?”您的
try…except
子句除了对自己隐藏自己的错误之外似乎没有任何作用。如果您确实想使用try/except,那么您应该始终指定预期的异常(在本例中为keyrerror)这样,它们就不会无意中隐藏无关的bug。但在这种情况下,除非并行线程中有代码修改
d
,否则您永远不会得到键错误,因为
k
必须在
d
中,因为它是由
d.keys()
返回的。在Python 2中,迭代
d.keys()
(这是一个列表)使删除循环中的值成为可能。在Python3中,
d.keys()
是。而是迭代
list(d)
,或者构建一个新字典,如中所示
>>> default = {'a': ['alpha'], 'b': ['beta','gamma'], 'g': []}

>>> {key: value for key, value in default.iteritems() if value}
{'a': ['alpha'], 'b': ['beta', 'gamma']}
dict((k, v) for k, v in default.iteritems() if v)
def remove_empty_keys(d):
    for k in d.keys():
        if not d[k]:
            del d[k]
>>> 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']})
for e in [k for k,v in default.iteritems() if len(v) == 0]: default.pop(e)
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']}