如何避免“RuntimeError:字典在迭代期间改变大小”的错误?

我已经检查了所有其他相同的错误,但没有find有用的解决scheme= /

我有一个列表字典:

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

其中一些值是空的。 在创build这些列表的最后,我想在返回字典之前删除这些空列表。 目前我正在试图做到这一点如下:

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

然而,这是给我的运行时错误。 我知道,你不能添加/删除字典中的元素,而迭代通过它…什么是解决这个问题呢?

在Python 2.x调用keys创build一个可以在修改dict迭代的密钥的副本:

 for i in d.keys(): 

请注意,这在Python 3.x中不起作用,因为keys返回一个迭代器而不是一个列表。

另一种方法是使用list来强制复制密钥。 这个也可以在Python 3.x中使用:

 for i in list(d): 

只要使用字典理解复制相关项目成一个新的字典

 >>> 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] 

你只需要使用“复制”:

就这样,你迭代原来的字典字段,并在飞行中可以改变所需的字典(D字典)。 这是每个Python版本的工作,所以更清楚。

 In [1]: d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]} In [2]: for i in d.copy(): ...: if not d[i]: ...: d.pop(i) ...: In [3]: d Out[3]: {'a': [1], 'b': [1, 2]} 

对于PY3:

 {k:v for k,v in d.items() if v}