web-dev-qa-db-ja.com

Python辞書では 'has_key()'または 'in'を使うべきですか?

どうすればよいのだろうか。

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

または

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

inは間違いなくPythonicです。

実際、 has_key()はPython 3.xで削除されました

1136
tonfa

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

次の観察はalways trueではありませんが、通常 _はPythonでは、より速い解決法がよりエレガントでPythonicです。それが-mtimeitがSOに役立つ理由です - あちこちで100ナノ秒を節約することについてはjustではありません! - )

244
Alex Martelli

によるとpython docs

has_key()key in dのために廃止予定です。

88
Nadia Alramli

コードが2.3より前のバージョンのPythonで実行可能である必要がある場合に限り(key in dictが導入された場合に限り)dict.has_key()を使用してください。

39
John Machin

inが実際にパフォーマンスを低下させる例が1つあります。

__getitem__has_key()のみを実装し、__contains__を実装しないO(1)コンテナでinを使用する場合は、O(1)検索をO(N)検索に変換します。 in__getitem__を介した線形検索にフォールバックします。

修正は明らかに簡単です。

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

has_keyはディクショナリメソッドですが、inはどのコレクションに対しても機能します。また、__contains__が欠落している場合でも、inは他のメソッドを使用してコレクションを繰り返し検索します。

15
u0b34a0f6ae

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"
14
Greena modi

Adam ParkinのコメントでAlex Martelliのパフォーマンステストを拡張中...

$ 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
10
Bruno Bronosky

Python 2.xはhas_key()をサポートしています。

Python 2.3以降およびPython 3.xはinをサポートしています。

9
SiriusKoder

このようなものがあれば

t.has_key(ew)

python 3.X以降で実行するには、これを以下に変更してください。

key = ew
if key not in t
1
Harshita Jhavar