检查字典中是否已存在给定键

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

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

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

答案

in是测试dict密钥是否存在的预期方法。

d = dict()

for i in range(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

如果要使用默认值,则可以始终使用dict.get()

d = dict()

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

...,如果您想始终确保任何键的默认值,则可以从collections模块中使用defaultdict ,如下所示:

from collections import defaultdict

d = defaultdict(int)

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

... 但总的来说, in关键字是最好的方法。

您不必呼叫按键:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

这将更快,因为它使用字典的哈希而不是进行线性搜索(调用键可以做到)。

您可以使用in关键字测试字典中是否存在键:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

在更改字典之前,在字典中检查键是否存在的常见用途是对值进行默认初始化(例如,如果您的值是列表,并且您想确保可以在其后附加一个空列表)在插入键的第一个值时)。在这种情况下,您可能会发现collections.defaultdict()类型令人感兴趣。

在较早的代码中,您可能还会发现has_key()一些用法, has_key()是一种不推荐使用的方法,用于检查字典中键的存在(仅key_name in dict_name使用key_name in dict_name )。

您可以缩短此时间:

if 'key1' in dict:
    ...

但是,这充其量是对化妆品的改善。为什么您认为这不是最好的方法?

有关快速执行接受的答案的建议方法(10m 循环)的其他信息:

  • 'key' in mydict经过时间 1.07 秒
  • mydict.get('key')经过的时间 1.84 秒
  • mydefaultdict['key']经过的时间 1.07 秒

因此in建议使用indefaultdict反对get

我建议改用setdefault方法。听起来它将满足您的所有要求。

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

python 中的 Dictionary 具有 get('key',default)方法。因此,您可以在没有密钥的情况下设置默认值。

values = {...}
myValue = values.get('Key', None)

如何使用 EAFP(比请求更容易获得宽恕):

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

查看其他 SO 帖子:

在 python 中使用 try vs if

在 Python 中检查成员是否存在

使用三元运算符:

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

获得结果的方式是:

哪个更好取决于三个因素:

  1. 字典 “通常没有钥匙” 还是 “通常没有钥匙”。
  2. 您是否打算使用 if ... else ... elseif ... else 之类的条件?
  3. 字典有多大?

了解更多: http : //paltman.com/try-except-performance-in-python-a-simple-test/

使用 try / block 代替 “in” 或 “if”:

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."