我应该在 Python 字典中使用“has_key()”还是“in”?[重复]
- 2025-01-17 09:23:00
- admin 原创
- 148
问题描述:
鉴于:
>>> d = {'a': 1, 'b': 2}
以下哪种是检查 是否'a'
在 的最佳方法d
?
>>> 'a' in d
True
>>> d.has_key('a')
True
解决方案 1:
in
绝对更加 Python 化。
事实上has_key()
在 Python 3.x 中已被删除。
解决方案 2:
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
虽然以下观察并不总是正确的,但您会注意到,在 Python 中,更快的解决方案通常-mtimeit
更优雅、更 Pythonic;这就是为什么它如此有用——它不仅仅是在这里和那里节省一百纳秒!-)
解决方案 3:
根据python文档:
has_key()
已被弃用,取而代之的是
key in d
。
解决方案 4:
dict.has_key()
当(且仅当)您的代码需要在 Python 2.3 之前的版本(key in dict
推出时)运行时使用。
解决方案 5:
有一个例子in
实际上会损害你的表现。
如果您在仅实现和但不实现in
的 O(1) 容器上使用,则会将 O(1) 搜索变成 O(N) 搜索(因为通过 回退到线性搜索)。__getitem__
`has_key()__contains__
in`__getitem__
修复显然很简单:
def __contains__(self, x):
return self.has_key(x)
解决方案 6:
dict.has_key() 已弃用,请使用 'in' 解决方案——Sublime Text Editor 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"
解决方案 7:
通过 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
解决方案 8:
has_key
是一种字典方法,但in
可以对任何集合起作用,并且即使__contains__
缺失,in
也可以使用任何其他方法来迭代集合来找出答案。
解决方案 9:
如果你有类似这样的情况:
t.has_key(ew)
将其更改为以下内容以在 Python 3.X 及更高版本上运行:
key = ew
if key not in t
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD