2012-07-05 3 views
0

문제 부분의 각 반복에 재평가에 루프를 얻을 :어떻게 코드의 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 
+3

나는 While식이 참으로 재 계산 될 때마다 While 루프가 반복 될 것이라고 확신한다. 카운터는 어떻게 사용합니까? 비헤이비어를 복제 할 수있는 충분한 코드 만 포함 할 수 있다면 가장 쉽습니다. – HugoRune

+0

또한 문제가 dictionary.items()에 있다고 생각합니다. –

+0

여기에 문제가 실제로 무엇인지 표시하지 않습니다. 매번'dictionary.items()'에 다른 값을 기대합니까? 그렇다면 실제로 어딘가에서'카운터 '를 사용해야 할 것입니다. –

답변

1

for 문의 표현식은 for 루프가 시작될 때마다 한 번 평가됩니다. for 루프를 while 루프에 넣었으므로 for 루프가 발생할 때마다 for 문이 발생하면 표현식이 평가됩니다.

코드에 다른 문제가 있습니다. 실제 코드 샘플을 게시하십시오.

1

내 생각 엔는이 영업 이익은 기본 사전에 포함 된 '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과 연결되어있는 것으로 보입니다.

카운터 또는 루프 인덱스가 필요한 파이썬에서는 그림과 같이 for을 사용하여 직접 반복 할 수 있으므로 목록 또는 사전과 같은 컨테이너의 내용을 처리 할 필요가없는 경우가 많습니다.