답변:
사전에 있는지 여부에 관계없이 키를 삭제하려면 다음과 같이 두 개의 인수 형식을 사용하십시오 dict.pop()
.
my_dict.pop('key', None)
이 반환 my_dict[key]
되면 key
사전에 존재하며, None
그렇지. 두 번째 매개 변수가 지정되지 않은 (즉. 경우 my_dict.pop('key')
) 및 key
존재하지 않는하는이 KeyError
발생합니다.
존재한다고 보장되는 키를 삭제하려면 다음을 사용할 수도 있습니다.
del my_dict['key']
KeyError
키가 사전에 없으면 키를 올립니다 .
pop()
over 사용의 이점 del
: 해당 키의 값을 반환합니다. 이렇게하면 한 줄의 코드로 dict에서 항목을 가져오고 삭제할 수 있습니다.
try
/ except
솔루션 보다 훨씬 빠릅니다 . 하나 또는 다른 것을 읽기가 더 쉽다는 것을 알 수 있습니다. 둘 다 관용적 인 파이썬이므로 원하는 것을 선택하십시오. 그러나이 답변이 더 복잡하거나 비효율적이라고 주장하는 것은 말이되지 않습니다.
self
하지 않으므로이 경우에는 다소 놀랍습니다.
구체적으로 "이 작업을 수행하는 한 가지 방법이 있습니까?"
if 'key' in my_dict: del my_dict['key']
... 음, 당신 은 물었다 ;-)
당신은에서 개체를 삭제하는이 방법이 있다고하지만, 고려해야 할 dict
것입니다 원자하지 - 그것은 것은 그 수 'key'
에있을 수 있습니다 my_dict
동안 if
문하지만, 전에 삭제 될 수 있습니다 del
경우가있는, 실행 del
실패합니다 KeyError
. 이것을 감안할 때, 사용dict.pop
하거나 무언가를 사용하는 것이 가장 안전합니다.
try:
del my_dict['key']
except KeyError:
pass
물론 이것은 확실히 하나의 라이너가 아닙니다 .
pop
확실히 더 간결하지만, 이런 식으로하는 것의 주요 이점이 있습니다 : 그것은 무엇을하고 있는지 즉시 분명합니다.
try/except
문은 더 비싸다. 예외 발생이 느립니다.
try
조금 더 빠르지 만 try
실제로는 그렇지 않습니다 . 존재하지 않는 키를 pop
제외 try
하고 는 상당히 일관성이 있지만 모두보다 느립니다 . gist.github.com/zigg/6280653을 참조하십시오 . 궁극적으로, 키가 실제로 사전에 얼마나 자주 있을지, 원 자성이 필요한지 여부, 그리고 물론 조기 최적화에 관여하는지 여부에 따라 달라집니다.)
if 'key' in mydict: #then del...
. 올바르게 구문 분석하기 위해 dict에서 키 / val을 꺼내야했습니다. 팝은 완벽한 솔루션이 아닙니다.
정확히 무엇을하고 있는지 알아내는 데 시간이 걸렸습니다 my_dict.pop("key", None)
. 따라서 다른 인터넷 검색 시간을 절약하기 위해 이것을 답변으로 추가하겠습니다.
pop(key[, default])
키 가 사전에 있으면 키를 제거하고 값을 리턴하고 그렇지 않으면 기본값을 리턴하십시오 . 경우 기본값이 주어지지하고 키가 사전에없는, a는
KeyError
발생합니다.
dict.pop?
IPython에서.
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)
. 모두는 적어도 세 배 빠른 속도로보다 del
A의 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
pop
A를 del
. 사전을 만들면 사전에서 물건을 완전히 삭제하는 것이 왜소합니다.
del
와 의 차이 pop
)
한 줄의 코드로 사전에서 많은 키를 제거 해야하는 경우 map () 사용은 간결하고 파이썬으로 읽을 수 있다고 생각합니다.
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']]
효과가있다. myDict에 'e'키가 없더라도 'e'는 오류를 발생시키지 않았습니다.
map
친구가 이제 게으르고 반복자를 반환 하기 때문에 작동하지 않습니다 . map
부작용에 사용 하는 것은 일반적으로 나쁜 습관으로 간주됩니다. 표준 for ... in
루프가 더 좋습니다. 자세한 내용 은 목록 대신보기 및 반복자 를 참조하십시오.
[myDict.pop(i, None) for i in ['a', 'c']]
에서 작동해야 합니다 map
(및 filter
)에 대한 일반적인 대안을 제공합니다 .
for ... in
루프를 사용하십시오 .
map()
부작용에 사용되는을 사용하는 것과 관련이 있습니다. 파이썬에서 권장되는 대안은 있다 내 의견으로는 여전히 한 줄 (질문 참조)와 같은 매우 읽기 및인지 적으로 빛이 목록의 이해. 부작용에만 사용되는 두 가지 구조 모두 실제로 쓸모없는 목록을 만들어 비효율적 일 수 있습니다. Python3부터는 비싼 부산물없이 생성기 표현식을 통해 안전하고 우아하게 반복 할 수있는 내장 함수를 알지 못합니다 (예 :) loop(d.pop(k) for k in ['a', 'b'])
.
다음과 같은 접근 방식으로 파이썬 사전에서 키를 삭제할 수 있습니다.
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
if myDict.get('one')
키가 있는지 확인하는 데 사용하지 마십시오 ! myDict [ 'one']에 잘못된 값이 있으면 실패합니다. 또한 dicts에는 고유 한 순서가 없으므로 언급하지 않는 것이 좋습니다.
매우 장황하게하려면 예외 처리를 사용할 수 있습니다.
try:
del dict[key]
except KeyError: pass
그러나 pop()
키가 없으면 방법 보다 속도가 느립니다 .
my_dict.pop('key', None)
몇 개의 키는 중요하지 않지만이 작업을 반복적으로 수행하는 경우 후자의 방법이 더 좋습니다.
가장 빠른 방법은 다음과 같습니다.
if 'key' in dict:
del myDict['key']
그러나이 방법은 'key'
두 줄 사이에서 제거 하면 a KeyError
가 발생 하기 때문에 위험 합니다.
또 다른 방법은 items () + dict comprehension을 사용하는 것입니다.
dict 이해와 결합 된 items () 또한 키-값 쌍 삭제 작업을 수행하는 데 도움이 될 수 있지만, 적절한 dict 기술이 아닌 단점이 있습니다. 우리가 포함하고 싶지 않은 키를 제외하고는 실제로 새로운 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}
이
my_dict
장소에서 변경 됩니다 (변경 가능)
my_dict.pop('key', None)
새로운 dict 생성 (불변)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)