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

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

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


当前回答

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

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

其他回答

使用Python三元运算符:

message = "blah" if 'key1' in my_dict else "booh"
print(message)

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

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

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

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

只是给克里斯一个补充。B(最佳)答案:

d = defaultdict(int)

同样有效;原因是调用int()返回0,这是defaultdict在幕后(构造字典时)所做的,因此文档中的名称为“Factory Function”。

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

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

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

另一种使用布尔运算符检查键是否存在的方法:

d = {'a': 1, 'b':2}
keys = 'abcd'

for k in keys:
    x = (k in d and 'blah') or 'boo'
    print(x)

这将返回

>>> blah
>>> blah
>>> boo
>>> boo

解释

首先,您应该知道在Python中,0、None或长度为零的对象的计算结果为False。其他所有值均为True。布尔运算从左到右求值,返回的操作数不是True或False。

让我们看一个例子:

>>> 'Some string' or 1/0
'Some string'
>>>

由于“Some string”的计算结果为True,因此不会计算或的其余部分,也不会引发除零错误。

但是,如果我们切换顺序1/0,则首先求值并引发异常:

>>> 1/0 or 'Some string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>

我们可以使用这个模式来检查是否存在密钥。

(k in d and 'blah')

if k in d:
    'blah'
else:
    False

如果键存在,这已经返回了正确的结果,但我们希望它在不存在时打印“boo”。所以,我们用“boo”表示结果

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>>