コードの問題部分:
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 回評価されます」と表示されます。
スクリプトを実行すると、カウンターが 1 増加したため、キー エラーが発生し続けます。しかし、 for ステートメントは、別の辞書であるリストからの新しい要素を反映するように更新されていません。まだ最初の要素を使用しています。
while ループの各反復により、For ステートメントが再評価されると想定しました。どうやら私はその点で間違っていました。
これでコードを書き直してこれを修正できますが、これに何度か遭遇したので知りたいのは、この方法で while ステートメントで For ループを使用する方法です。 - while ループの各反復で For ステートメントを評価します。
ありがとう!
更新: 以下に実際のコードを追加しました。私が何か間違ったことをしているだけだとしても、私は驚かないでしょう。デバッガーで値を監視していたところ、count が 0 から 1 に変わると、while ループの次の繰り返しで開始されました。そこから、For ループ「for key,value in item.items():」に到達するまで、すべてが正常に進み、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