如何避免“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}