값을 기준으로 사전에서 항목을 제거하는 가장 좋은 방법은 무엇입니까 (예 : 항목의 키를 알 수없는 경우)? 다음은 간단한 접근 방식입니다.
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
더 좋은 방법이 있습니까? 반복하는 동안 사전에서 변경 (항목 삭제)하는 데 문제가 있습니까?
값을 기준으로 사전에서 항목을 제거하는 가장 좋은 방법은 무엇입니까 (예 : 항목의 키를 알 수없는 경우)? 다음은 간단한 접근 방식입니다.
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
.
some_dict.iteritems()
여기에서 사용 하고 가독성을 위해 별도의 줄에 for
및 if
문을 입력 할 수 있습니다.
iteritems
있으며 현재 items
. Python 2.7에서는 iteritems()
실제로 더 좋습니다.
a = {'name': 'your_name','class': 4}
if 'name' in a: del a['name']
del 과 pop () 간의 간단한 비교 :
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
따라서 del 은 pop () 보다 빠릅니다 .
pop()
(위의 @ n-1-1이 수행 한 것처럼) del
. 이는 연산자 옵션이 아닙니다 .
timeit
. 이 명확한 예에 감사드립니다.
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
y={'username':'admin','machine':['a','b','c']}
if 'c' in y['machine'] : del y['machine'][y['machine'].index('c')]
제안한대로 반복하는 동안 사전에서 항목을 삭제하는 데 아무런 문제가 없습니다. 동시에 동일한 사전을 사용하는 여러 스레드에주의하십시오. KeyError 또는 기타 문제가 발생할 수 있습니다.
물론 http://docs.python.org/library/stdtypes.html#typesmapping 의 문서를 참조하십시오.
for k,v in d.iteritems(): del d[k]
줄 것이다 RuntimeError: dictionary changed size during iteration
. mithrandi의 설명을 참조하십시오.