개발/Python

[파이썬] 사전에서 키를 제거하는 방법

MinorMan 2022. 12. 13. 10:35
반응형

<질문>

키를 올리지 않고 사전에서 키를 삭제하는 한 줄 방법이 있습니까?KeyError?

if 'key' in my_dict:
    del my_dict['key']

<답변1>

사전에 있는지 여부에 관계없이 키를 삭제하려면 인수가 두 개인 다음 형식을 사용하십시오.dict.pop():

my_dict.pop('key', None)

이것은 돌아올 것이다my_dict[key]만약에key사전에 존재하고None그렇지 않으면. 두 번째 매개변수가 지정되지 않은 경우(예:my_dict.pop('key')) 그리고key존재하지 않는다,KeyError제기됩니다.

존재가 보장된 키를 삭제하려면 다음을 사용할 수도 있습니다.

del my_dict['key']

이것은KeyError키가 사전에 없는 경우.


<답변2>

특히 "이 작업을 수행하는 한 줄 방법이 있습니까?"

if 'key' in my_dict: del my_dict['key']

...당신을 잘물었다;-)

그러나 이러한 방식으로 객체를 삭제하는 것을 고려해야 합니다.dict~이다not atomic—가능하다'key'에있을 수 있습니다my_dictif하지만 그 전에 삭제될 수 있습니다.del실행되며, 이 경우del실패할 것이다KeyError. 이를 감안할 때 다음 중 하나가 가장 안전할 것입니다.use dict.pop또는 라인을 따라 뭔가

try:
    del my_dict['key']
except KeyError:
    pass

물론 그것은 확실히~ 아니다원 라이너.


<답변3>

정확히 무엇인지 파악하는 데 시간이 좀 걸렸습니다.my_dict.pop("key", None)하고있다. 따라서 다른 사람들의 인터넷 검색 시간을 절약하기 위해 이것을 답변으로 추가하겠습니다.

pop(key[, default]) 키가 사전에 있으면 제거하고 값을 반환하고 그렇지 않으면 기본값을 반환합니다. 기본값이 주어지지 않고 키가 사전에 없으면 KeyError가 발생합니다.

Documentation


<답변4>

del my_dict[key]보다 약간 더 빠름my_dict.pop(key)키가 존재할 때 사전에서 키를 제거하기 위해

>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"

>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786

그러나 키가 존재하지 않을 때if key in my_dict: del my_dict[key]보다 약간 더 빠름my_dict.pop(key, None). 둘 다 보다 최소 3배 더 빠릅니다.del안에try/except성명:

>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
...     del d['missing key']
... except KeyError:
...     pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133

<답변5>

한 줄의 코드로 사전에서 많은 키를 제거해야 하는 경우 map()을 사용하는 것이 매우 간결하고 Pythonic으로 읽을 수 있다고 생각합니다.

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

사전에 없는 값을 팝하는 오류를 잡아야 하는 경우 다음과 같이 map() 내에서 람다를 사용합니다.

map(lambda x: myDict.pop(x,None), ['a', 'c', 'e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

또는 안으로python3, 대신 목록 이해를 사용해야 합니다.

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

효과가있다. 그리고 'e'는 myDict에 'e' 키가 없었음에도 불구하고 오류를 일으키지 않았습니다.


<답변6>

당신은 사용할 수 있습니다dictionary comprehension해당 키가 제거된 새 사전을 만들려면 다음을 수행하십시오.

>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}

조건에 따라 삭제할 수 있습니다. 다음과 같은 경우 오류 없음key존재하지 않습니다.


<답변7>

다음 접근 방식 중 일부를 사용하여 Python 사전에서 키를 삭제할 수 있습니다.

사용하여del예어; 그것은 당신이했던 것과 거의 같은 접근 방식입니다-

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

또는

다음과 같이 할 수 있습니다.

하지만 이 과정에서 실제로는삭제특정 키를 만드는 대신 사전의 키제외된그 사전에서. 또한 다음과 같이 주문되지 않은 사전을 반환하는 것을 관찰했습니다.myDict.

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

쉘에서 실행하면 다음과 같이 실행됩니다.{'five': 500, 'four': 400, 'three': 300, 'two': 200}- 순서가 같지 않음에 유의하십시오.myDict. 다시 인쇄를 시도하면myDict, 이 접근 방식으로 사전에서 제외한 모든 키를 볼 수 있습니다. 그러나 다음 명령문을 변수에 할당하여 새 사전을 만들 수 있습니다.

var = {key:value for key, value in myDict.items() if key != 'one'}

이제 인쇄를 시도하면 상위 순서를 따릅니다.

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

또는

사용하여pop()방법.

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

차이점del그리고pop사용하는 것입니다pop()메서드를 사용하면 실제로 저장할 수 있습니다.키 값필요한 경우 다음과 같이

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

포크this gist이 정보가 유용하다고 생각되면 나중에 참조할 수 있습니다.


<답변8>

매우 장황하게 하려면 예외 처리를 사용할 수 있습니다.

try: 
    del dict[key]

except KeyError: pass

그러나 이것은 이전보다 느립니다.pop()키가 존재하지 않는 경우 메소드.

my_dict.pop('key', None)

몇 개의 키에는 문제가 되지 않지만 이 작업을 반복적으로 수행하는 경우에는 후자의 방법이 더 좋습니다.

가장 빠른 접근 방식은 다음과 같습니다.

if 'key' in dict: 
    del myDict['key']

하지만 이 방법은 위험하기 때문에'key'두 줄 사이에서 제거됩니다.KeyError제기됩니다.


<답변9>

나는 불변 버전을 선호한다

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}

<답변10>

또 다른 방법은 items() + dict comprehension을 사용하는 것입니다.

dict comprehension과 결합된 items()도 키-값 쌍 삭제 작업을 수행하는 데 도움이 될 수 있지만 적절한 dict 기술이 아니라는 단점이 있습니다. 실제로 포함하고 싶지 않은 키를 제외하고 생성된 경우 새 사전입니다.

test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}

# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))

# Using items() + dict comprehension to remove a dict. pair
# removes  vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}

# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))

산출:

dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}

<답변11>

없이 하고 싶다면KeyError, 임시 클래스를 선언하고 dict.get에서 기본값으로 설정할 수 있습니다. 값이 해당 클래스와 같으면 키가 존재하지 않는다는 것을 의미합니다.

a={"Assemblyisscary":3637}
key1="Assemblyisscary"
key2="Binarylangisnightmare"
def delkey(dictionary,key):
    class temp:pass
    if temp==dictionary.get(key,temp):return False
    else: del dictionary[key];return True
delete(a,key2)
delete(a,key1)
False
True
반응형