키 값을 업데이트하기 전에 사전에 키가 있는지 테스트하고 싶었습니다. 다음 코드를 작성했습니다.
if 'key1' in dict.keys(): print "blah" else: print "boo"
이것이 이 작업을 수행하는 가장 좋은 방법이 아니라고 생각합니다. 사전에서 키를 테스트하는 더 좋은 방법이 있습니까?
질문자 :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
키워드가 가장 좋은 방법입니다.
키를 호출할 필요가 없습니다.
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
에서 key_name 사용).
다음과 같이 코드를 줄일 수 있습니다.
if 'key1' in my_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)
EAFP를 사용하는 것은 어떻습니까(허가보다 용서를 구하는 것이 더 쉽습니다):
try: blah = dict["mykey"] # key exists in dict except KeyError: # key doesn't exist in dict
다른 SO 게시물 보기:
파이썬 삼항 연산자 사용:
message = "blah" if 'key1' in my_dict else "booh" print(message)
결과를 얻을 수 있는 방법은 다음과 같습니다.
어느 것이 더 나은지는 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."
has_key()
메서드를 사용할 수 있습니다.
if dict.has_key('xyz')==1: #update the value for the key else: pass
참고로 Chris에 추가합니다. B(최선의 답변):
d = defaultdict(int)
잘 작동합니다. int()
0
을 반환하기 때문입니다. defaultdict
가 (사전을 구성할 때) 배후에서 수행하는 작업이므로 설명서에서 "Factory Function"이라는 이름을 사용합니다.
주어진 키가 사전에 이미 존재하는지 확인
이를 수행하는 방법에 대한 아이디어를 얻으려면 먼저 사전에서 호출할 수 있는 메서드를 검사합니다. 방법은 다음과 같습니다.
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()
.
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.
부울 연산자를 사용하여 키가 있는지 확인하는 또 다른 방법을 공유합니다.
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' >>>
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')
출처 : http:www.stackoverflow.com/questions/1602934/check-if-a-given-key-already-exists-in-a-dictionary
Flash CS4가 놓기를 거부합니다. (0) | 2021.11.11 |
---|---|
Git으로 커밋을 선택한다는 것은 무엇을 의미합니까? (0) | 2021.11.11 |
사전을 반복하는 가장 좋은 방법은 무엇입니까? [닫은] (0) | 2021.11.11 |
내 JavaScript 코드는 "요청된 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다" 오류를 수신하지만 Postman은 그렇지 않은 이유는 무엇입니까? (0) | 2021.11.10 |
Windows에 pip를 어떻게 설치합니까? (0) | 2021.11.10 |