考虑到:
>>> d = {'a': 1, 'b': 2}
下面哪个选项是检查a是否在d中的最好方法?
>>> 'a' in d
True
>>> d.has_key('a')
True
考虑到:
>>> d = {'a': 1, 'b': 2}
下面哪个选项是检查a是否在d中的最好方法?
>>> 'a' in d
True
>>> d.has_key('a')
True
当前回答
如果你有这样的东西:
t.has_key(ew)
为了在python3上运行,将其更改为以下。X及以上:
key = ew
if key not in t
其他回答
根据python文档:
Has_key()已弃用 输入d。
有一个例子,它实际上会扼杀你的表现。
如果你在一个只实现__getitem__和has_key()而不实现__contains__的O(1)容器上使用in,你将把O(1)搜索变成O(N)搜索(就像通过__getitem__返回到线性搜索一样)。
Fix显然是微不足道的:
def __contains__(self, x):
return self.has_key(x)
用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显然更python化。
事实上,has_key()在Python 3.x中已被删除。
如果你有这样的东西:
t.has_key(ew)
为了在python3上运行,将其更改为以下。X及以上:
key = ew
if key not in t