igo*_*gue 867 python dictionary
我想知道做什么更好:
d = {'a': 1, 'b': 2}
'a' in d
True
Run Code Online (Sandbox Code Playgroud)
要么:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
Run Code Online (Sandbox Code Playgroud)
ton*_*nfa 1223
in 肯定是更加pythonic.
Ale*_*lli 250
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
Run Code Online (Sandbox Code Playgroud)
虽然以下观察并非总是如此,但您会注意到,通常,在Python中,更快的解决方案是更优雅和Pythonic; 这就是为什么-mtimeitSO有用 - 它不只是在这里和那里节省一百纳秒! - )
Joh*_*hin 39
使用dict.has_key()if(且仅当)您的代码需要由早于2.3的Python版本(key in dict引入时)运行.
sch*_*enk 22
有一个例子in实际上会杀死你的表现.
如果你使用in一个O(1)集装箱只实现__getitem__和has_key()而不是__contains__你会变成一个O(1)搜索到O(N),搜索(如in回落到通过线性搜索__getitem__).
修复显然是微不足道的:
def __contains__(self, x):
return self.has_key(x)
Run Code Online (Sandbox Code Playgroud)
小智 14
不推荐使用dict.has_key()的解决方案,使用'in' - sublime文本编辑器3
这里我举了一个名为'age'的字典的例子 -
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"
Run Code Online (Sandbox Code Playgroud)
Bru*_*sky 13
亚当·帕金的评论扩展了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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
609326 次 |
| 最近记录: |