etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 11. 11. 07:57
반응형

질문자 :Mohan Gulati


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

 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() 반복적으로 사용하거나 다음과 같이 collections 모듈에서defaultdict

 from collections import defaultdict d = defaultdict(int) for i in range(100): d[i % 10] += 1

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


Chris B.

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

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

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


Jason Baker

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 에서 key_name 사용).


Michael Aaron Safyan

다음과 같이 코드를 줄일 수 있습니다.

 if 'key1' in my_dict: ...

그러나 이것은 기껏해야 미용 개선입니다. 이것이 최선의 방법이 아니라고 생각하는 이유는 무엇입니까?


Greg Hewgill

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

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

따라서 in 또는 defaultdict get 에 대해 권장됩니다.


Wtower

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}

David Berger

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

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

mafonya

EAFP를 사용하는 것은 어떻습니까(허가보다 용서를 구하는 것이 더 쉽습니다):

 try: blah = dict["mykey"] # key exists in dict except KeyError: # key doesn't exist in dict

다른 SO 게시물 보기:

파이썬에서 try 대 if 사용하기

Python에서 멤버 존재 확인


HungryArthur

파이썬 삼항 연산자 사용:

 message = "blah" if 'key1' in my_dict else "booh" print(message)

Charitoo

결과를 얻을 수 있는 방법은 다음과 같습니다.

어느 것이 더 나은지는 3가지에 달려 있습니다.

  1. 사전에 '보통 키가 있음' 또는 '보통 키가 없음'입니다.
  2. if...else...elseif...else와 같은 조건을 사용하시겠습니까?
  3. 사전은 얼마나 큽니까?

더 읽어보기: http://paltman.com/try-except-performance-in-python-a-simple-test/

'in' 또는 'if' 대신 try/block 사용:

 try: my_dict_of_items[key_i_want_to_check] except KeyError: # Do the operation you wanted to do for "key not present in dict". else: # Do the operation you wanted to do with "key present in dict."

Bishwas Mishra

Python 2만 해당: (그리고 python 2.7은 이미 `in`을 지원합니다)

has_key() 메서드를 사용할 수 있습니다.

 if dict.has_key('xyz')==1: #update the value for the key else: pass

wan kenobi

참고로 Chris에 추가합니다. B(최선의 답변):

 d = defaultdict(int)

잘 작동합니다. int() 0 을 반환하기 때문입니다. defaultdict 가 (사전을 구성할 때) 배후에서 수행하는 작업이므로 설명서에서 "Factory Function"이라는 이름을 사용합니다.


Mauricio Morales

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

이를 수행하는 방법에 대한 아이디어를 얻으려면 먼저 사전에서 호출할 수 있는 메서드를 검사합니다. 방법은 다음과 같습니다.

 d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

 Python Dictionary clear() Removes all Items Python Dictionary copy() Returns Shallow Copy of a Dictionary Python Dictionary fromkeys() Creates dictionary from given sequence Python Dictionary get() Returns Value of The Key Python Dictionary items() Returns view of dictionary (key, value) pair Python Dictionary keys() Returns View Object of All Keys Python Dictionary pop() Removes and returns element having given key Python Dictionary popitem() Returns & Removes Element From Dictionary Python Dictionary setdefault() Inserts Key With a Value if Key is not Present Python Dictionary update() Updates the Dictionary Python Dictionary values() Returns view of all values in dictionary

키가 이미 존재하는지 확인하는 잔인한 방법은 get() 방법일 수 있습니다.

 d.get("key")

다른 두 가지 흥미로운 메서드 items()keys() 는 너무 많은 작업처럼 들립니다. get() 이 우리에게 적합한 방법인지 조사해 보겠습니다. 우리는 우리의 dict d :

 d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

인쇄하면 가지고 있지 않은 키가 None 을 반환한다는 것을 보여줍니다.

 print(d.get('key')) #None print(d.get('clear')) #0 print(d.get('copy')) #1

키가 있는지 여부에 따라 정보를 얻을 수 있습니다. key:None 사용하여 dict를 만드는 경우 이것을 고려하십시오.

 d= {'key':None} print(d.get('key')) #None print(d.get('key2')) #None

None 일 수 있는 경우 get() 메서드를 선도하는 것은 신뢰할 수 없습니다. 이 이야기는 해피엔딩이어야 합니다. in 비교자를 사용하는 경우:

 print('key' in d) #True print('key2' in d) #False

우리는 올바른 결과를 얻습니다. Python 바이트 코드를 조사할 수 있습니다.

 import dis dis.dis("'key' in d") # 1 0 LOAD_CONST 0 ('key') # 2 LOAD_NAME 0 (d) # 4 COMPARE_OP 6 (in) # 6 RETURN_VALUE dis.dis("d.get('key2')") # 1 0 LOAD_NAME 0 (d) # 2 LOAD_METHOD 1 (get) # 4 LOAD_CONST 0 ('key2') # 6 CALL_METHOD 1 # 8 RETURN_VALUE

것이이 쇼 in 비교 연산자 단지 더 신뢰할 수 있지만 더 빨리 이상입니다 get() .


prosti

Python 사전에는 __contains__ 라는 메서드가 있습니다. 이 메서드는 사전에 키가 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다.

 >>> temp = {} >>> help(temp.__contains__) Help on built-in function __contains__: __contains__(key, /) method of builtins.dict instance True if D has a key k, else False.

Siva Gnanam

부울 연산자를 사용하여 키가 있는지 확인하는 또 다른 방법을 공유합니다.

 d = {'a': 1, 'b':2} keys = 'abcd' for k in keys: x = (k in d and 'blah') or 'boo' print(x)

이것은 반환

 >>> blah >>> blah >>> boo >>> boo

설명

0 , None 또는 길이가 0인 객체는 False 평가된다는 것을 알아야 합니다. 다른 모든 것은 True 평가됩니다. 부울 연산은 왼쪽에서 오른쪽으로 평가되며 True 또는 False가 아닌 피연산자를 반환합니다.

예를 들어 보겠습니다.

 >>> 'Some string' or 1/0 'Some string' >>>

'Some string'True 평가되므로 나머지 or 는 평가되지 않으며 0으로 나누기 오류가 발생하지 않습니다.

그러나 순서를 1/0 이 먼저 평가되고 예외가 발생합니다.

 >>> 1/0 or 'Some string' Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero >>>

키가 존재하는지 확인하는 패턴에 이것을 사용할 수 있습니다.

 (k in d and 'blah')

와 동일하게 수행

 if k in d: 'blah' else: False

이것은 키가 존재하는 경우 이미 올바른 결과를 반환하지만, 키가 없을 때 'boo'를 인쇄하기를 원합니다. 그래서, 우리는 결과와 가지고 or 에 그것을 'boo'

 >>> False or 'boo' 'boo' >>> 'blah' or 'boo' 'blah' >>>

J. Antunes

for 루프를 사용하여 사전을 반복하고 사전에서 찾고자 하는 키의 이름을 얻을 수 있습니다. 그런 다음 if

 dic = {'first' : 12, 'second' : 123} for each in dic: if each == 'second': print('the key exists and the corresponding value can be updated in the dictionary')

Abdulkalek

출처 : http:www.stackoverflow.com/questions/1602934/check-if-a-given-key-already-exists-in-a-dictionary

반응형