<질문>
키를 올리지 않고 사전에서 키를 삭제하는 한 줄 방법이 있습니까?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_dict
시if
하지만 그 전에 삭제될 수 있습니다.del
실행되며, 이 경우del
실패할 것이다KeyError
. 이를 감안할 때 다음 중 하나가 가장 안전할 것입니다.use dict.pop
또는 라인을 따라 뭔가
try:
del my_dict['key']
except KeyError:
pass
물론 그것은 확실히~ 아니다원 라이너.
<답변3>
정확히 무엇인지 파악하는 데 시간이 좀 걸렸습니다.my_dict.pop("key", None)
하고있다. 따라서 다른 사람들의 인터넷 검색 시간을 절약하기 위해 이것을 답변으로 추가하겠습니다.
pop(key[, default]) 키가 사전에 있으면 제거하고 값을 반환하고 그렇지 않으면 기본값을 반환합니다. 기본값이 주어지지 않고 키가 사전에 없으면 KeyError가 발생합니다.
<답변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
'개발 > Python' 카테고리의 다른 글
[파이썬] ImportError: No module named 'ConfigParser' (0) | 2023.01.20 |
---|---|
[파이썬] 리스트 항목을 문자열로 연결(조인)하는 방법 (0) | 2022.12.13 |
[파이썬 Pillow] PIL 이미지에서 EXIF 데이터 제거 (0) | 2022.12.09 |
[파이썬] 표준 라이브러리에서 docstring trim (PEP 257) (1) | 2022.12.08 |