programing

사전에서 반복하는 동안 사전에서 항목을 삭제하려면 어떻게 해야 합니까?

kingscode 2022. 10. 19. 21:22
반응형

사전에서 반복하는 동안 사전에서 항목을 삭제하려면 어떻게 해야 합니까?

Python 사전에서 반복하면서 항목을 삭제할 수 있습니까?

완전히 새로운 사전을 만드는 대신 사전에서 특정 조건을 충족하지 않는 요소를 제거하고 싶습니다.아래가 좋은 해결책인가요, 아니면 더 나은 방법이 있을까요?

for k, v in mydict.items():
    if k == val:
        del mydict[k]

Python 3+의 경우:

>>> mydict
{'four': 4, 'three': 3, 'one': 1}

>>> for k in list(mydict.keys()):
...     if mydict[k] == 3:
...         del mydict[k]

>>> mydict
{'four': 4, 'one': 1}

다른 답변은 Python 2에서는 정상적으로 동작하지만 Python 2는RuntimeErrorPython 3의 경우:

RuntimeError: 반복 중에 사전 크기가 변경되었습니다.

은, 「 」가 원인으로 발생합니다.mydict.keys()목록이 아닌 반복기를 반환합니다.와 같이 변환합니다.mydict.keys()list(mydict.keys())효과가 있을 거야


Python 2의 경우:

콘솔의 간단한 테스트에서는 사전을 반복하는 동안 사전을 수정할 수 없습니다.

>>> mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

>>> for k, v in mydict.iteritems():
...    if k == 'two':
...        del mydict[k]

------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

한 바와 같이 엔트리로 하려고 할 때 합니다.delnan.''를 합니다.keys().

>>> for k in mydict.keys():
...    if k == 'two':
...        del mydict[k]

>>> mydict
{'four': 4, 'three': 3, 'one': 1}

값에 가 있는 경우 " " 를 합니다.items()「이것들」은 다음과 같습니다.

>>> for k, v in mydict.items():
...     if v == 3:
...         del mydict[k]

>>> mydict
{'four': 4, 'one': 1}

다음 두 단계로 수행할 수도 있습니다.

remove = [k for k in mydict if k == val]
for k in remove: del mydict[k]

제가 가장 좋아하는 방법은 보통 새로운 dict를 만드는 것입니다.

# Python 2.7 and 3.x
mydict = { k:v for k,v in mydict.items() if k!=val }
# before Python 2.7
mydict = dict((k,v) for k,v in mydict.iteritems() if k!=val)

해 주세요.를 들어, 카피가 등입니다.items():

for k, v in list(mydict.items()):

컬렉션을 반복하는 동안에는 수정할 수 없습니다. 중요한 것은 및할 수 (+1로하고 다음 은 (+1)로 이동해야 .가장 중요한 것은 현재 아이템을 삭제 및 삭제할 수 있는 경우 반복자는 (+1)로 이동하고 다음 호출은next(+2)를 넘어서 한 요소(삭제된 요소 바로 뒤에 있는 요소)를 건너뛰게 됩니다.가 있습니다.

  • 모든 키(또는 필요한 항목에 따라 값 또는 둘 다)를 복사한 후 해당 키 위에 반복합니다.하시면 됩니다..keys()를 Python 3으로 합니다).list 낭비될 수 .) 그러나 공간적으로 매우 낭비가 클 수 있습니다.
  • mydict합니다.to_delete다 끝냈을 때.. 반복이 완료되면을 계속 바꾸mydict에서의모든 항목을 삭제합니다 항목을 모두 삭제하다.to_delete부터에서mydict. 첫번째 접근법,라 또한 몇개 더 많은 선의 조인 방식을 결정해야 하는(에 따라 얼마나 많은 키와 얼마나 많은 있어 삭제됩니다)공간 저장합니다.첫 번째 접근법에 비해(삭제된 키 수와 체류 수에 따라)공간을 절약할 수 있지만 몇 줄 더 필요합니다.

사용하는 것이 가장 깨끗합니다.

>>> mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> for k in list(mydict):
...     if k == 'three':
...         del mydict[k]
... 
>>> mydict
{'four': 4, 'two': 2, 'one': 1}

이는 목록의 병렬 구조에 해당합니다.

>>> mylist = ['one', 'two', 'three', 'four']
>>> for k in list(mylist):                            # or mylist[:]
...     if k == 'three':
...         mylist.remove(k)
... 
>>> mylist
['one', 'two', 'four']

둘 다 python2와 python3으로 동작합니다.

python3에서는 dic.keys()에서 반복하면 사전 크기 오류가 발생합니다.다음 대체 방법을 사용할 수 있습니다.

python3으로 테스트하면 정상적으로 동작하며 오류 "반복사전 변경 크기"는 발생하지 않습니다.

my_dic = { 1:10, 2:20, 3:30 }
# Is important here to cast because ".keys()" method returns a dict_keys object.
key_list = list( my_dic.keys() )

# Iterate on the list:
for k in key_list:
    print(key_list)
    print(my_dic)
    del( my_dic[k] )


print( my_dic )
# {}

사전 이해를 사용할 수 있습니다.

d = {k:d[k] for k in d if d[k] != val}

먼저 삭제할 키 목록을 작성한 후 해당 목록에서 해당 키 삭제를 반복할 수 있습니다.

dict = {'one' : 1, 'two' : 2, 'three' : 3, 'four' : 4}
delete = []
for k,v in dict.items():
    if v%2 == 1:
        delete.append(k)
for i in delete:
    del dict[i]

삭제하려는 항목이 항상 dict 반복의 "시작"에 있는 경우 적합한 방법이 있습니다.

while mydict:
    key, value = next(iter(mydict.items()))
    if should_delete(key, value):
       del mydict[key]
    else:
       break

"시작"은 특정 Python 버전/실장에서만 일관성이 보장됩니다.예를 들어 What's New In Python 3.7의 경우

dict 객체의 삽입 순서 보존 특성은 Python 언어 사양의 공식 부분으로 선언되었습니다.

이렇게 하면 적어도 Python 3에서는 많은 다른 답변이 제안하는 dict의 복사를 피할 수 있습니다.

위의 솔루션을 Python3에서 사용해 보았습니다만, dict에 오브젝트를 저장할 때는 이 솔루션밖에 사용할 수 없는 것 같습니다.기본적으로 dict()의 복사본을 만들고 원래 사전의 엔트리를 삭제하면서 그 복사본을 반복합니다.

        tmpDict = realDict.copy()
        for key, value in tmpDict.items():
            if value:
                del(realDict[key])

언급URL : https://stackoverflow.com/questions/5384914/how-do-i-delete-items-from-a-dictionary-while-iterating-over-it

반응형