[python] 키를 알 수없는 경우 사전에서 항목 제거

값을 기준으로 사전에서 항목을 제거하는 가장 좋은 방법은 무엇입니까 (예 : 항목의 키를 알 수없는 경우)? 다음은 간단한 접근 방식입니다.

for key, item in some_dict.items():
    if item is item_to_remove:
        del some_dict[key]

더 좋은 방법이 있습니까? 반복하는 동안 사전에서 변경 (항목 삭제)하는 데 문제가 있습니까?



답변

현재 객체 ID를 테스트하고 있다는 점에 유의하세요 ( 두 피연산자가 메모리에서 동일한 객체로 표현되는 경우 is에만 반환 True됩니다.이 경우와 같게 비교되는 두 객체가 항상 그런 것은 아닙니다 ==). 의도적으로이 작업을 수행하는 경우 코드를 다음과 같이 다시 작성할 수 있습니다.

some_dict = {key: value for key, value in some_dict.items()
             if value is not value_to_remove}

그러나 이것은 당신이 원하는 것을 할 수 없습니다.

>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}

따라서 !=대신 is not.


답변

dict.pop(key[, default])방법을 사용하면 키를 알고있을 때 항목을 제거 할 수 있습니다. 항목을 제거하면 키의 값을 반환하고 그렇지 않으면 전달 된 것을 반환합니다 default. 문서를 참조하십시오 . ‘

예:

>>> dic = {'a':1, 'b':2}
>>> dic
{'a': 1, 'b': 2}
>>> dic.pop('c', 0)
0
>>> dic.pop('a', 0)
1
>>> dic
{'b': 2}


답변

a = {'name': 'your_name','class': 4}
if 'name' in a: del a['name']


답변

delpop () 간의 간단한 비교 :

import timeit
code = """
results = {'A': 1, 'B': 2, 'C': 3}
del results['A']
del results['B']
"""
print timeit.timeit(code, number=100000)
code = """
results = {'A': 1, 'B': 2, 'C': 3}
results.pop('A')
results.pop('B')
"""
print timeit.timeit(code, number=100000)

결과:

0.0329667857143
0.0451040902256

따라서 delpop () 보다 빠릅니다 .


답변

items()목록을 반환하고 반복하는 목록이므로 루프에서 dict를 변경하는 것은 여기서 중요하지 않습니다. iteritems()대신 사용 하는 경우 루프에서 dict를 변경하는 것은 문제가 될 수viewitems() 있으며 Python 2.7 에서도 마찬가지입니다 .

값으로 dict에서 항목을 제거하는 더 좋은 방법을 생각할 수 없습니다.


답변

제거가 필요한 키 목록을 작성한 다음 제거합니다. 간단하고 효율적이며 딕셔너리를 반복하고 변경하는 것과 관련된 문제를 방지합니다.

keys_to_remove = [key for key, value in some_dict.iteritems()
                  if value == value_to_remove]
for key in keys_to_remove:
    del some_dict[key]


답변

c는 새 사전이고 a는 원래 사전이고 { ‘z’, ‘w’}는 a에서 제거하려는 키입니다.

c = {key:a[key] for key in a.keys() - {'z', 'w'}}

또한 확인 : https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html