Python字典错误
问题描述:
在下面的代码d_arr是字典Python字典错误
def process_data(d_arr):
flag2 = 0
for dictionaries in d_arr:
for k in dictionaries:
if (k == "*TYPE"):
""" Here we determine the type """
if (dictionaries[k].lower() == "name"):
dictionaries.update({"type" : 0})
func = name(dictionaries)
continue
elif (dictionaries[k].lower() == "ma"):
dictionaries.update({"type" : 1})
func = DCC(dictionaries)
logging.debug(type(func))
continue
数组当上面做我得到一个错误说
for k in dictionaries:
RuntimeError: dictionary changed size during iteration
2010-08-02 05:26:44,167 DEBUG Returning
是该禁做这样的事情
答
它,的确,被禁止的。此外,你并不真的需要在这里的所有密钥循环,因为奇怪的名字dictionaries
似乎是一个单一的字典;而不是for k in dictionaries:
(或可行for k in dictionaries.keys()
是@三联的答案建议),您可以使用...:
tp = dictionaries.get('*TYPE')
if tp is not None:
""" Here we determine the type """
if tp.lower() == 'name':
dictionaries.update({"type" : 0})
func = name(dictionaries)
elif tp.lower() == "ma":
dictionaries.update({"type" : 1})
func = DCC(dictionaries)
logging.debug(type(func))
这将是更快,如果dictionaries
有任何相当长,为你直接到达对于您关心的一个条目,而不是遍历所有条目以检查其中每个条目,以查看它是否是是您关心的那个。
即使您选择忽略你的代码的一部分,所以在此之后开始循环上dictionaries
是仍然需要,我觉得我的建议仍然是可取的,因为它可以让你得到任何改动dictionaries
完成, (当然假设你不会在你的代码的假设部分改变它,我想你可能选择省略;-)。
答
该错误信息丰富;你不能改变你正在迭代的字典的大小。
的解决方案是让所有的按键一次,并在它们之间迭代:
# Do this
for k in dictionaries.keys():
# Not this
for k in dictionaries:
非常有用的提示。 – Hulk 2010-08-02 05:42:30
男人你如何找到时间?你喜欢,实际上阅读所有的代码。 – Triptych 2010-08-02 08:29:30