[python] Python dicts에서 ‘has_key ()’또는 ‘in’을 사용해야합니까?

더 나은 일이 궁금합니다.

d = {'a': 1, 'b': 2}
'a' in d
True

또는:

d = {'a': 1, 'b': 2}
d.has_key('a')
True



답변

in 확실히 더 pythonic입니다.

실제로 has_key()Python 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

다음과 같은 관찰이 항상 사실 은 아니지만 , 일반적으로 파이썬에서는 더 빠른 솔루션이 더 우아하고 Pythonic 임을 알 수 있습니다 . 그 이유 -mtimeit는 아니다 – SO 도움이 단지 여기에 수백 나노초 저장 정보와이 -!)


답변

파이썬 문서 에 따르면 :

has_key()은 더 이상 사용되지 않습니다
key in d.


답변

사용 dict.has_key()하는 경우 (그리고 경우에만) 코드는 이전 2.3 이상 (때 파이썬 버전에서 실행 가능한 것이 요구된다 key in dict도입되었다).


답변

in실제로 성능을 저하시키는 한 가지 예가 있습니다.

당신이 사용하는 경우 in에만 구현하는 O에 (1) 컨테이너 __getitem__has_key()하지만,하지 __contains__(당신은 O (1)는 O (N) 검색으로 검색 바뀝니다 in통해 선형 검색을 다시 떨어진다 __getitem__).

수정은 분명히 사소한 것입니다.

def __contains__(self, x):
    return self.has_key(x)


답변

has_key는 사전 방법이지만 in모든 컬렉션에서 작동하며 __contains__누락 된 in경우에도 다른 방법을 사용하여 컬렉션을 반복하여 찾을 수 있습니다.


답변

dict.has_key () 솔루션은 더 이상 사용되지 않습니다. ‘in’사용-숭고한 텍스트 편집기 3

여기서는 ‘ages’라는 사전의 예를 보았습니다.

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"