判断字典中是否存在键

56 投票
4 回答
131542 浏览
提问于 2025-04-16 04:16

我有一个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中已经被去掉了,具体可以查看这个链接

撰写回答