我有一个字典的列表,其中一些值是空的:

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

在创建这些列表的最后,我想在返回字典之前删除这些空列表。我试着这样做:

for i in d:
    if not d[i]:
        d.pop(i)

但是我得到了一个RuntimeError。我知道你不能在字典中添加/删除元素,而迭代它…那有什么解决办法呢?


请参阅在迭代Python字典时修改它,以了解这会导致问题的引用以及原因。


当前回答

出现运行时错误的原因是,当数据结构在迭代过程中发生变化时,您无法对其进行迭代。

实现您所寻找的一种方法是使用一个列表来附加您想要删除的键,然后使用dictionary上的pop函数在遍历列表时删除已标识的键。

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
pop_list = []

for i in d:
        if not d[i]:
                pop_list.append(i)

for x in pop_list:
        d.pop(x)
print (d)

其他回答

Python 3不允许在迭代(使用上面的for循环)字典时删除。有各种各样的替代方案;一个简单的方法就是换线

for i in x.keys():

with

for i in list(x)

在Python 3中。X和2。X你可以使用使用列表强制复制键:

for i in list(d):

在Python 2中。X调用键复制了你可以在修改dict时迭代的键:

for i in d.keys():

但请注意,在Python 3中。第二种方法对你的错误没有帮助,因为keys返回一个视图对象,而不是将键复制到列表中。

只需使用字典推导式将相关项复制到一个新的词典中:

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = {k: v for k, v in d.items() if v}
>>> d
{'a': [1], 'b': [1, 2]}

在Python 2中:

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = {k: v for k, v in d.iteritems() if v}
>>> d
{'a': [1], 'b': [1, 2]}

我会尽量避免在第一个位置插入空列表,但是,通常会使用:

d = {k: v for k,v in d.iteritems() if v} # re-bind to non-empty

如果在2.7之前:

d = dict( (k, v) for k,v in d.iteritems() if v )

或者是:

empty_key_vals = list(k for k in k,v in d.iteritems() if v)
for k in empty_key_vals:
    del[k]

当字典在for循环中更改时,您不能遍历它。对列表进行类型转换并遍历该列表。这对我很管用。

    for key in list(d):
        if not d[key]:
            d.pop(key)