문제

루프에서 사전에서 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():
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top