判断字典中是否存在键
我有一个Python字典,比如说 mydict = {'name':'abc','city':'xyz','country':'def'}
。
我该怎么检查一个键是否在这个字典里呢?我已经知道了这些方法:
if mydict.has_key('name'):
if 'name' in mydict:
4 个回答
14
从字节码的角度来看,in
会保存一个 LOAD_ATTR
,并把一个 CALL_FUNCTION
替换成 COMPARE_OP
。
>>> dis.dis(indict)
2 0 LOAD_GLOBAL 0 (name)
3 LOAD_GLOBAL 1 (d)
6 COMPARE_OP 6 (in)
9 POP_TOP
>>> dis.dis(haskey)
2 0 LOAD_GLOBAL 0 (d)
3 LOAD_ATTR 1 (haskey)
6 LOAD_GLOBAL 2 (name)
9 CALL_FUNCTION 1
12 POP_TOP
我觉得 in
读起来要清晰得多,在我能想到的所有情况下都更值得使用。
从性能上看,时间反映了操作码的表现。
$ python -mtimeit -s'd = dict((i, i) for i in range(10000))' "'foo' in d"
10000000 loops, best of 3: 0.11 usec per loop
$ python -mtimeit -s'd = dict((i, i) for i in range(10000))' "d.has_key('foo')"
1000000 loops, best of 3: 0.205 usec per loop
in
的速度几乎快了一倍。
40
跟martineau的回答一样,最好的解决办法往往是不去检查。例如,下面这段代码
if x in d:
foo = d[x]
else:
foo = bar
通常可以写成
foo = d.get(x, bar)
这样更简短,而且更直接表达了你的意思。
另一个常见的情况是像下面这样的代码
if x not in d:
d[x] = []
d[x].append(foo)
可以重写成
d.setdefault(x, []).append(foo)
或者用collections.defaultdict(list)
来更好地重写d
,写成
d[x].append(foo)
84
if 'name' in mydict:
这是更推荐的、符合Python风格的写法。使用 has_key()
这个方法是不太提倡的,而且这个方法在Python 3中已经被去掉了,具体可以查看这个链接。