사전을 업데이트 해야하는 방법
-
23-08-2019 - |
문제
루프에서 사전에서 AK/V 쌍을 삭제해야합니다. 얻은 후 RuntimeError: dictionary changed size during iteration
k/v를 삭제 한 후 사전을 피우고 외부 루프 중 하나에서 새로 절인/업데이트 된 사전을 다시 열려고합니다. 그러나 많은 사람들이 아마 알 수 있듯이 아마도 같은 오류를 얻을 것입니다. 루프의 상단에 도달하면 생각합니다. 가장 바깥 쪽 루프에서 사전을 사용하지 않습니다.
그래서 내 질문은이 문제를 해결하는 방법을 아는 사람이 있습니까? 나는 사전에서 AK/V 쌍을 삭제하고 다음 루프 반복에서 크기가 크기가 큰 사전을 사용하고 싶습니다.
문제에 집중하고 Cygil의 솔루션을 사용하려면
list=[27,29,23,30,3,5,40]
testDict={}
for x in range(25):
tempDict={}
tempDict['xsquared']=x*x
tempDict['xinverse']=1.0/(x+1.0)
testDict[(x,x+1)]=tempDict
for item in list:
print 'the Dictionary now has',len(testDict.keys()), ' keys'
for key in testDict.keys():
if key[0]==item:
del testDict[key]
연구 보조원이 이름 변형으로 인해 일치 할 수없는 두 개의 데이터 세트의 관찰을 비교해야하기 때문에이 작업을 수행하고 있습니다. 아이디어는 하나의 데이터 세트 (예 : 세트 a)에서 이름을 던지고 키 일치를 기반으로 다른 데이터 세트 (세트 B)에서 해당 키에 첨부 된 모든 이름을 찾는 것입니다. 하나의 A 경기가 확인되었음을 확인했습니다. 나는 B의 값을 다시 보여주고 싶지 않습니다. 6,000 개의 관찰이 있기 때문에 나는 그들이 일을 시작할 때마다 시작할 때 시작하기를 원하지 않습니다. 그러나 나는 그들이 함께 일한 A에서 마지막 키를 입력하기로 선택하게함으로써 그것을 고칠 수 있습니다. 하지만 경기가 확인되면 B를 줄여야합니다.
해결책
코드가 없으면 다음과 같은 글을 쓰고 있다고 가정합니다.
for key in dict:
if check_condition(dict[key]):
del dict[key]
그렇다면 글을 쓸 수 있습니다
for key in list(dict.keys()):
if key in dict and check_condition(dict[key]):
del dict[key]
list(dict.keys())
뷰가 아닌 키 사본을 반환하여 사전에서 삭제할 수 있습니다 (이 경우 사전 자체의 키가 아니라 키의 사본을 반복하고 있습니다.)
다른 팁
값이> 15 인 모든 키를 삭제하십시오.
for k in mydict.keys(): # makes a list of the keys and iterate
# over the list, not over the dict.
if mydict[k] > 15:
del mydict[k]
변화:
for ansSeries in notmatched:
에게:
for ansSeries in notmatched.copy():