동일한 오류로 다른 모든 질문을 확인했지만 유용한 해결책을 찾지 못했습니다 = /
목록 사전이 있습니다.
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의 필드에 액세스하기 위해 위치를 색인으로 지정할 수 있습니다.
