문제 부분의 각 반복에 재평가에 루프를 얻을 :어떻게 코드의 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} ] }
인하는 .
그래서 나는 필자가 파이썬 (3.2.3)을 가르치면서 작성한 일부 스크립트에서이 사실을 몇 번 발견했습니다.
검색을 시도했지만 운이 좋지 않습니다 (어쩌면 내 검색 용어가 잘못 되었습니까?) 문서를 확인한 결과 문제가있는 것으로 보이는 while 문은 while 문이 사용됩니다 표현식이 참일 때까지 반복적으로 실행하는 것 "을 의미합니다. For 문에서 "표현식 목록은 한 번 평가됩니다"라고 표시됩니다.
이제 스크립트가 실행될 때 카운터가 1 씩 증가하기 때문에 키 오류가 계속 발생합니다. for 문은 다른 사전 인 목록의 새 요소를 반영하여 업데이트되지 않습니다. 그것은 여전히 첫 번째 요소를 사용하고 있습니다.
while 루프에서 반복 할 때마다 For 문이 다시 평가된다고 가정했습니다. 명백하게 나는 그 계산에 틀렸다.
이제이 문제를 해결하기 위해 코드를 다시 작성할 수 있지만 이미 몇 번이나이 문제를 경험 했으므로이 패턴으로 For 문을 사용할 수 있습니까? while 루프를 통해 각 반복에서 For 문을 다시 평가하도록하십시오.
감사합니다.
업데이트 : 아래 실제 코드를 추가했습니다. 내가 뭔가 잘못하고 있으면 놀라지 않을 것이다. 디버거에서 값을보고 있었고 count가 0에서 1로 바뀌면 while 루프의 다음 반복에서 시작되었습니다. 거기에서부터 "for 키, 값 item.items() :"의 For 루프를 치기 전까지 item.items()의 값은 전혀 변하지 않았습니다. 업데이트 업데이트 : 문제를 파악하기 위해 노력한 후, v에 대한 항목에 대한 확신이 있습니다. 문제의 원인입니다. 내가 알아낼 수 있는지 보자!
고정! 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식이 참으로 재 계산 될 때마다 While 루프가 반복 될 것이라고 확신한다. 카운터는 어떻게 사용합니까? 비헤이비어를 복제 할 수있는 충분한 코드 만 포함 할 수 있다면 가장 쉽습니다. – HugoRune
또한 문제가 dictionary.items()에 있다고 생각합니다. –
여기에 문제가 실제로 무엇인지 표시하지 않습니다. 매번'dictionary.items()'에 다른 값을 기대합니까? 그렇다면 실제로 어딘가에서'카운터 '를 사용해야 할 것입니다. –