2010-08-02 119 views
0

在下面的代碼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 

是該禁做這樣的事情

回答

3

它,的確,被禁止的。此外,你並不真的需要在這裏的所有密鑰循環,因爲奇怪的名字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

3

該錯誤信息豐富;你不能改變你正在迭代的字典的大小。

的解決方案是讓所有的按鍵一次,並在它們之間迭代:

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

# Not this 
for k in dictionaries: