“런타임 오류 : 반복하는 동안 사전 크기 변경”오류를 피하는 방법은 무엇입니까? 못했습니다 = / 목록 사전이 있습니다. d = {‘a’:

동일한 오류로 다른 모든 질문을 확인했지만 유용한 해결책을 찾지 못했습니다 = /

목록 사전이 있습니다.

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

일부 값은 비어 있습니다. 이 목록을 만들 때 사전을 반환하기 전에 빈 목록을 제거하고 싶습니다. 현재 다음과 같이 이것을하려고합니다.

for i in d:
    if not d[i]:
        d.pop(i)

그러나 이것은 런타임 오류를 발생시킵니다. 나는 그것을 반복하는 동안 사전에 요소를 추가 / 제거 할 수 없다는 것을 알고 있습니다 …이 주위의 방법은 무엇입니까?



답변

Python 2.x에서 호출 keys은 다음을 수정하는 동안 반복 할 수있는 키의 사본을 만듭니다 dict.

for i in d.keys():

keys목록 대신 반복자를 반환 하기 때문에 Python 3.x에서는 작동하지 않습니다 .

다른 방법은 list키 사본을 작성하는 데 사용하는 것입니다. 이것은 Python 3.x에서도 작동합니다.

for i in list(d):


답변

사전 이해를 사용하여 관련 항목을 새 dict에 복사하십시오.

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = { k : v for k,v in d.iteritems() if v}
>>> d
{'a': [1], 'b': [1, 2]}

이것을 위해 파이썬 3에서

>>> d
{'a': [1], 'c': [], 'b': [1, 2], 'd': []}
>>> d = { k : v for k,v in d.items() if v}
>>> d
{'a': [1], 'b': [1, 2]}


답변

“복사”만 사용하면됩니다.

그렇게하면 원래 사전 필드를 반복하고 원하는 dict (d dict)을 즉시 변경할 수 있습니다. 각 파이썬 버전에서 작동하므로 더 명확합니다.

In [1]: d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

In [2]: for i in d.copy():
   ...:     if not d[i]:
   ...:         d.pop(i)
   ...:

In [3]: d
Out[3]: {'a': [1], 'b': [1, 2]}


답변

처음에는 빈 목록을 삽입하지 않으려 고하지만 일반적으로 다음을 사용합니다.

d = {k: v for k,v in d.iteritems() if v} # re-bind to non-empty

2.7 이전의 경우 :

d = dict( (k, v) for k,v in d.iteritems() if v )

또는 그냥 :

empty_key_vals = list(k for k in k,v in d.iteritems() if v)
for k in empty_key_vals:
    del[k]


답변

파이썬 3의 경우 :

{k:v for k,v in d.items() if v}


답변

for 루프 중에 변경하는 동안 사전을 반복 할 수 없습니다. 목록을 캐스팅하고 해당 목록을 반복하면 나에게 효과적입니다.

    for key in list(d):
        if not d[key]:
            d.pop(key)


답변

이런 상황에서는 원본 dict을 수정하는 동안 딥 카피를 만들고 해당 카피를 반복합니다.

조회 필드가 목록 내에있는 경우 목록의 for 루프에 열거 한 다음 원래 dict의 필드에 액세스하기 위해 위치를 색인으로 지정할 수 있습니다.