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完成, (当然假设你不会在你的代码的假设部分改变它,我想你可能选择省略;-)。

+0

非常有用的提示。 – Hulk 2010-08-02 05:42:30

+0

男人你如何找到时间?你喜欢,实际上阅读所有的代码。 – Triptych 2010-08-02 08:29:30

该错误信息丰富;你不能改变你正在迭代的字典的大小。

的解决方案是让所有的按键一次,并在它们之间迭代:

# Do this 
for k in dictionaries.keys(): 

# Not this 
for k in dictionaries: