[python] 사전에서 안전하게 여러 키 제거

내 사전에서 ‘key’항목을 d안전하게 제거하는 방법을 알고 있습니다.

if d.has_key('key'):
    del d['key']

그러나 사전에서 여러 항목을 안전하게 제거해야합니다. 이 작업을 두 번 이상 수행해야하므로 튜플의 항목을 정의 할 생각이었습니다.

entitiesToREmove = ('a', 'b', 'c')
for x in entitiesToRemove:
    if d.has_key(x):
        del d[x]

그러나 이것을 수행하는 더 똑똑한 방법이 있는지 궁금합니다.



답변

왜 이렇게하지 :

entries = ('a', 'b', 'c')
the_dict = {'b': 'foo'}

def entries_to_remove(entries, the_dict):
    for key in entries:
        if key in the_dict:
            del the_dict[key]

보다 간결한 버전은 dict.pop ()을 사용하여 mattbornski에 의해 제공되었습니다.


답변

d = {'some':'data'}
entriesToRemove = ('any', 'iterable')
for k in entriesToRemove:
    d.pop(k, None)


답변

Dict Comprehensions 사용

final_dict = {key: t[key] for key in t if key not in [key1, key2]}

여기서 key1key2 는 제거됩니다.

아래 예에서 “b”및 “c”키는 제거되고 키 목록에 보관됩니다.

>>> a
{'a': 1, 'c': 3, 'b': 2, 'd': 4}
>>> keys = ["b", "c"]
>>> print {key: a[key] for key in a if key not in keys}
{'a': 1, 'd': 4}
>>> 


답변

솔루션은 mapfilter기능을 사용 하고 있습니다.

파이썬 2

d={"a":1,"b":2,"c":3}
l=("a","b","d")
map(d.__delitem__, filter(d.__contains__,l))
print(d)

파이썬 3

d={"a":1,"b":2,"c":3}
l=("a","b","d")
list(map(d.__delitem__, filter(d.__contains__,l)))
print(d)

당신은 얻는다 :

{'c': 3}


답변

제거하려는 키에 대한 값도 검색해야한다면 다음과 같이하는 것이 좋습니다.

valuesRemoved = [d.pop(k, None) for k in entitiesToRemove]

물론에서 키를 제거하기 위해서만이 작업을 수행 d할 수 있지만 목록 이해를 사용하여 값 목록을 불필요하게 생성하게됩니다. 함수의 부작용만을 위해 목록 이해력을 사용하는 것도 약간 불분명합니다.


답변

pop및 솔루션을 찾았습니다.map

d = {'a': 'valueA', 'b': 'valueB', 'c': 'valueC', 'd': 'valueD'}
keys = ['a', 'b', 'c']
list(map(d.pop, keys))
print(d)

이것의 출력 :

{'d': 'valueD'}

나는 누군가가 똑같은 것을 검색하면 미래에 도움이 될 것이라고 생각하기 때문에이 질문에 너무 늦게 대답했습니다. 그리고 이것은 도움이 될 것입니다.

최신 정보

위 코드는 dict에 키가 없으면 오류가 발생합니다.

DICTIONARY = {'a': 'valueA', 'b': 'valueB', 'c': 'valueC', 'd': 'valueD'}
keys = ['a', 'l', 'c']

def remove_keys(key):
    try:
        DICTIONARY.pop(key, None)
    except:
        pass  # or do any action

list(map(remove_key, keys))
print(DICTIONARY)

산출:

DICTIONARY = {'b': 'valueB', 'd': 'valueD'}


답변

기존 답변에 문제가 없지만이 솔루션을 찾지 못한 것에 놀랐습니다.

keys_to_remove = ['a', 'b', 'c']
my_dict = {k: v for k, v in zip("a b c d e f g".split(' '), [0, 1, 2, 3, 4, 5, 6])}

for k in keys_to_remove:
    try:
        del my_dict[k]
    except KeyError:
        pass

assert my_dict == {'d': 3, 'e': 4, 'f': 5, 'g': 6}

참고 : 여기 에서이 질문을 우연히 발견 했습니다 . 그리고 내 대답은 이 대답 과 관련 있습니다.