나는 파이썬 코드 조각이있다.이 코드는 루프 몸체가 사전을 바꿀 수있는 사전의 모든 키를 반복 할 필요가있다.변화하는 사전을 반복하다.
사전 반복자를 시도하면 RuntimeError: dictionary changed size during iteration
이됩니다. 오류 메시지를 검색하면 another question으로 안내됩니다. 제안 된 솔루션은 반복을 시작하기 전에 키 목록을 복사하는 것입니다.
하지만 원래의 키뿐만 아니라 반복되는 동안 반복되는 키를 반복해야하기 때문에이 시나리오는 부분적인 대답입니다. 사전에 키가 더 이상 추가되지 않으면 종료되는 코드가 필요하며 사전에 이미있는 키를 처리했습니다.
지금까지 나는이 함께 올라와있다 :
processed = set()
while True:
keys = set(dictionary) - processed
if not keys:
break
for k in keys:
processed.add(k)
# Do something with k
이러한 접근 방식은 지나치게 복잡하게 보인다. 내가 그것을 단순화 할 수있는 방법이 있습니까, 그리고 여전히 각각의 키를 두 번 이상 처리하지 않고 사전에 추가되는 모든 키를 처리해야합니까? while 루프의 첫 번째 네 줄은 간단하게 기록 된 수있는 몇 가지 다른 언어
: 파이썬에서 작동하지 않습니다 그러나
while keys = set(dictionary) - processed:
. 나는 파이썬의 while 루프에서 조건으로 할당을 사용하는 것에 대해 a question을 발견했다. 그러나 제안 된 답변 중 어느 것도 내 시나리오에 적용되지 않는 것 같습니다.
내 루프 본문에 명시 적으로 키를 사전에 추가하지 않습니다. 오히려 사전에 키를 추가하거나 추가하지 않을 수도있는 다른 함수를 호출합니다. 따라서 루프의 본문에 어떤 키가 추가되었는지 알 수있는 유일한 방법은 현재 키 세트를 살펴 보는 것입니다. – kasperd
사전을 반복적으로 다시 검사하면 변경된 내용을 확인하는 데 많은 비용이 듭니다. 코드를 리팩토링 할 수있는 방법이 있습니까? 그래서 어떤 항목이 추가되는지 알고 계십니까? 그렇지 않다면 원본 코드가 나에게 잘 어울립니다. –
루프의 본문에 추가되는 내용을 알리려면 코드를 리팩토링하는 것이 실용적이지는 않습니다. 필자의 경우 세트 차이의 성능은 하나의 키를 처리하는 비용이 설정된 차이를 계산하는 비용보다 훨씬 높기 때문에 문제가되지는 않습니다. – kasperd