[python] 주어진 키가 사전에 이미 존재하는지 확인

키 값을 업데이트하기 전에 사전에 키가 있는지 테스트하고 싶었습니다. 다음 코드를 작성했습니다.

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

나는 이것이이 작업을 수행하는 가장 좋은 방법은 아니라고 생각합니다. 사전에서 키를 테스트하는 더 좋은 방법이 있습니까?



답변

in에 키가 있는지 테스트하는 의도 된 방법 dict입니다.

d = {"key1": 10, "key2": 23}

if "key1" in d:
    print("this will execute")

if "nonexistent key" in d:
    print("this will not")

기본값을 원하면 언제든지 다음을 사용할 수 있습니다 dict.get().

d = dict()

for i in range(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

그리고 항상 어떤 키의 기본값을 유지하려면 다음과 같이 dict.setdefault()반복적으로 또는 모듈 defaultdict에서 사용할 수 있습니다 collections.

from collections import defaultdict

d = defaultdict(int)

for i in range(100):
    d[i % 10] += 1

그러나 일반적으로 in키워드가 가장 좋은 방법입니다.


답변

키를 호출 할 필요가 없습니다.

if 'key1' in dict:
  print("blah")
else:
  print("boo")

호출 키가 수행하는 선형 검색을 수행하는 대신 사전의 해싱을 사용하므로 훨씬 빠릅니다 .


답변

in 키워드를 사용하여 사전에 키가 있는지 테스트 할 수 있습니다 .

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

키를 변경하기 전에 사전에 키가 있는지 확인하는 일반적인 용도는 값을 기본값으로 초기화하는 것입니다 (예 : 값이 목록 인 경우 추가 할 수있는 빈 목록이 있는지 확인하려는 경우). 키의 첫 번째 값을 삽입 할 때). 그러한 경우 collections.defaultdict()관심 있는 유형을 찾을 수 있습니다 .

이전 코드에서는 has_key()사전에 키의 존재를 확인하기 위해 사용되지 않는 방법 인을 사용할 수도 있습니다 key_name in dict_name(대신을 사용하십시오).


답변

이것을 줄일 수 있습니다 :

if 'key1' in dict:
    ...

그러나 이것은 외관상으로는 개선입니다. 이것이 최선의 방법이 아니라고 왜 생각하십니까?


답변

허용 된 답변의 제안 된 방법 (10m 루프)의 실행 속도에 대한 추가 정보 :

  • 'key' in mydict 경과 시간 1.07 초
  • mydict.get('key') 경과 시간 1.84 초
  • mydefaultdict['key'] 경과 시간 1.07 초

따라서 사용 in하거나 defaultdict하지 말아주세요 get.


답변

setdefault대신 방법을 사용하는 것이 좋습니다 . 그것은 당신이 원하는 모든 것을 할 것 같습니다.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}


답변

파이썬의 사전에는 get ( ‘key’, default) 메소드가 있습니다. 따라서 키가없는 경우 기본값을 설정할 수 있습니다.

values = {...}
myValue = values.get('Key', None)