問題部分的每次迭代重新評估:如何獲得一個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
我非常確定每次While循環循環時都會重新評估For表達式。你如何使用櫃檯?如果你可以包含足夠的代碼來複制行爲,那將是最簡單的。 – HugoRune 2012-07-05 21:28:27
我也認爲這個問題在dictionary.items() – 2012-07-05 21:33:33
你並不真正顯示問題在這裏。你是否期待'dictionary.items()'每次都有不同的值?如果是這樣,你實際上需要在那裏使用'counter'。 – 2012-07-05 21:39:49