考虑到:

>>> d = {'a': 1, 'b': 2}

下面哪个选项是检查a是否在d中的最好方法?

>>> 'a' in d
True
>>> d.has_key('a')
True

当前回答

In hands-down,不仅在优雅(不被弃用;-)上,而且在性能上,例如:

$ 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

虽然下面的观察并不总是正确的,但您会注意到,通常在Python中,更快的解决方案更优雅和Python化;这就是为什么-mtimeit是如此有用——它不仅仅是节省100纳秒!-)

其他回答

根据python文档:

Has_key()已弃用 输入d。

Has_key是一个字典方法,但in将适用于任何集合,甚至当__contains__缺失时,in将使用任何其他方法迭代集合以找出答案。

如果你有这样的东西:

t.has_key(ew)

为了在python3上运行,将其更改为以下。X及以上:

key = ew
if key not in t

用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

In hands-down,不仅在优雅(不被弃用;-)上,而且在性能上,例如:

$ 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

虽然下面的观察并不总是正确的,但您会注意到,通常在Python中,更快的解决方案更优雅和Python化;这就是为什么-mtimeit是如此有用——它不仅仅是节省100纳秒!-)