我想在更新键的值之前测试字典中是否存在键。我编写了以下代码:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

我认为这不是完成这项任务的最佳方式。有没有更好的方法来测试字典中的关键字?


当前回答

使用EAFP(请求宽恕比允许更容易):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

请参阅其他堆栈溢出帖子:

在Python中使用“try”与“if”检查Python中是否存在成员

其他回答

您可以将代码缩短为:

if 'key1' in my_dict:
    ...

然而,这充其量只是一种外观上的改进。为什么你认为这不是最好的方法?

Python字典具有名为__contains__的方法。如果字典具有键,则此方法将返回True,否则返回False。

>>> temp = {}

>>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

有关已接受答案的建议方法(1000万个循环)执行速度的其他信息:

mydict中的“key”已用时间1.07秒mydict.get('key')运行时间1.84秒mydefaultdict['key']已用时间1.07秒

因此,建议对get使用in或defaultdict。

在字典中是否存在密钥的测试中:

d = {"key1": 10, "key2": 23}

if "key1" in d:
    print("this will execute")

if "nonexistent key" in d:
    print("this will not")

当键不存在时,使用dict.get()提供默认值:

d = {}

for i in range(10):
    d[i] = d.get(i, 0) + 1

要为每个键提供默认值,请对每个赋值使用dict.setdefault():

d = {}

for i in range(10):
    d[i] = d.setdefault(i, 0) + 1

或使用集合模块中的defaultdict:

from collections import defaultdict

d = defaultdict(int)

for i in range(10):
    d[i] += 1

直接使用my_dict中的键,而不是my_dict.keys()中的键:

if 'key1' in my_dict:
    print("blah")
else:
    print("boo")

这将更快,因为它使用字典的O(1)哈希,而不是对关键字列表进行O(n)线性搜索。