2012-07-05 122 views
0

問題部分的每次迭代重新評估:如何獲得一個for循環來對代碼while循環

while counter < length: 
    if something: 
    else: 
     for key,value in dictionary.items(): 
      if something: 
      else: 
    counter += 1 

結構是{ key:[ {key:value,key1:value1}, {key:value,key1:value1} ] } 這是什麼計數器(列表索引)是。

所以我已經在我自學Python的一些腳本中注意到了這一點(3.2.3)。

我試過搜索,但沒有運氣(也許我的搜索條件是錯誤的,誰知道?),我已經檢查了文檔,似乎是什麼問題是while語句它說:「使用while語句只要表達是真實的,就可以重複執行「。 For語句表示「表達式列表被評估一次」。

現在,當我的腳本運行時,它不斷得到一個關鍵錯誤,因爲計數器增加了1;但for語句不更新以反映列表中的新元素,這是另一個字典;它仍然使用第一個元素。

我認爲while循環中的每次迭代都會導致For語句重新評估。顯然,我錯了那個數字。

現在我可以重寫代碼來解決這個問題,但是我想知道的是,我已經遇到過幾次了,我怎麼能以這種方式在while語句中使用For循環但讓它通過while循環重新評估每次迭代的For語句。

謝謝!

更新:我添加了下面的實際代碼。如果我只是做錯了什麼,這並不會讓我感到驚訝。我正在監視調試器中的值,並且當計數從0變爲1時,它開始於while循環的下一次迭代。從那裏一切都按原樣進行,直到它在item.items()中鍵入For循環「for key」的值,並且item.items()的值完全沒有改變。 更新更新:在試圖找出它後,我很確定它是v中的for項:這是導致問題的原因。讓我們看看我能否弄清楚!

固定!問題出在v中的For項:它在while循環之外,通過將它移入循環來解決。

def checkDifferences(newFile,oldFile): 
    resultDiff = [] 
    for k,v in newFile.items(): 
     if newFile[k] != oldFile[k]: 
      for item in v: 
       count = 0 
       lengthList = len(newFile[k]) 
       newKeys = newFile[k][count].keys() 
       oldKeys = oldFile[k][count].keys()     
       while count < lengthList: 
        if newKeys == oldKeys: 
         for key,value in item.items(): 
          newValue = newFile[k][count][key] 
          oldValue = oldFile[k][count][key] 
          if newValue == oldValue: 
           pass 
          else: 
           resultDiff.append((k,count,key, oldValue,newValue)) 
        else: 
         newValue = list(newFile[k][count].keys()) 
         oldValue = list(oldFile[k][count].keys()) 
         keyList = [key for key in newValue if key not in oldValue] 
         print(keyList) 
         for key,value in item.items(): 
          if key in keyList: 
           oldValue = oldFile[k][count][oldKey] 
           resultDiff.append((k,count,key, None,newValue)) 
          else: 
           oldValue = oldFile[k][count][key] 
          newValue = newFile[k][count][key] 
          if newValue == oldValue: 
           pass 
          else: 
           resultDiff.append((k,count,key, oldValue,newValue)) 
          oldKey = key 
        count += 1 
    return resultDiff 
+3

我非常確定每次While循環循環時都會重新評估For表達式。你如何使用櫃檯?如果你可以包含足夠的代碼來複制行爲,那將是最簡單的。 – HugoRune 2012-07-05 21:28:27

+0

我也認爲這個問題在dictionary.items() – 2012-07-05 21:33:33

+0

你並不真正顯示問題在這裏。你是否期待'dictionary.items()'每次都有不同的值?如果是這樣,你實際上需要在那裏使用'counter'。 – 2012-07-05 21:39:49

回答

1

每次for循環開始時,for語句中的表達式被評估一次。由於您已將for循環放入while循環中,每次在while循環周圍遇到for語句時,都會評估表達式。

你的代碼還有其他錯誤。發佈一個真實的代碼示例。

1

我的猜測是相信OP可能要循環包含在主網絡詞典的'dict的和下面,就是要的一般流程。

list_of_dicts = dictionary['key'] 
for subdict in list_of_dicts: 
    print subdict.items() # or whatever 
1

你的問題似乎有點含糊,我,但基於你對結構的格式和樣本代碼,事情大致如下意見將讓你來處理它的內容:

# for structure { key:[ {key:value,key1:value1}, {key:value,key1:value1}, ... ] } 

for dict_list in structure.values(): 
    if something: 
    else: 
     for key,value in dict_list.items(): 
      if something: 
      else: 

for循環將在每次從外部structure字典中檢索到另一個詞典列表時評估。我使用了structure.values(),因爲你似乎沒有對structure的按鍵感興趣。 structure的每個鍵似乎都與字典列表的值相關聯,即上面代碼中使用的dict_list變量。

在需要計數器或循環索引的Python中,通常不需要處理容器的內容(如列表或詞典),因爲您可以直接使用for來迭代它們,如圖所示。