어떻게 하는 것이 더 좋을지 궁금합니다:
d = {'a': 1, 'b': 2}
'a' in d
True
또는:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
in`이 확실히 더 피타고라스어입니다.
사실 has_key()
는 파이썬 3.x에서 제거되었습니다.
'in'은 우아함(그리고 더 이상 사용되지 않는 것; -)뿐만 아니라 성능에서도 압도적인 우위를 점합니다:
$ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d'
10000000 loops, best of 3: 0.0983 usec per loop
$ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)'
1000000 loops, best of 3: 0.21 usec per loop
다음 관찰이 항상 사실인 것은 아니지만, 일반적으로 파이썬에서는 더 빠른 솔루션이 더 우아하고 파이썬적이라는 것을 알 수 있습니다. 이것이 바로 -mtimeit
이 매우 유용한 이유입니다 - 단지 여기저기서 100나노초를 절약하는 것이 아니라!)
'사용' dict.has_key () 는 파이썬 코드에서 실행 가능한 경우 (때만) 가 되어야 하는 2.3 이전 버전의 경우 딕트 도입된 '키').
한 예로 '성능' 이 실제로 너회의 죽일겁니다 있습니다.
O (1) '에서' 를 사용하는 경우 해당 컨테이너입니다 구축 ' ()' 가 아닌 '' you '와' has_key getitem contains 발쿰치로 O (1) O (N) 에 있는 검색 (search (검색 등 '에서' 폭포 '를 통해 다시 일괄이라는 getitem').
사소한 문제 해결은 물론.
def __contains__(self, x):
return self.has_key(x)
ages = {}
# Add a couple of names to the dictionary
ages['Sue'] = 23
ages['Peter'] = 19
ages['Andrew'] = 78
ages['Karren'] = 45
# use of 'in' in if condition instead of function_name.has_key(key-name).
if 'Sue' in ages:
print "Sue is in the dictionary. She is", ages['Sue'], "years old"
else:
print "Sue is not in the dictionary"
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main
x = t.timeit(number)
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
d.has_key(12)
AttributeError: 'dict' object has no attribute 'has_key'
$ python2.7 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0872 usec per loop
$ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0858 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d'
10000000 loops, best of 3: 0.031 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d'
10000000 loops, best of 3: 0.033 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d.keys()'
10000000 loops, best of 3: 0.115 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()'
10000000 loops, best of 3: 0.117 usec per loop
이 같은 일이 있으면
t.has_key(ew)
윈도 3.X 에서 실행되는 잔인하니 아래 변경하십시오.
key = ew
if key not in t