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

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

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

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

5713755 次浏览

直接使用key in my_dict而不是key in my_dict.keys()

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

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

您可以将代码缩短为:

if 'key1' in my_dict:...

然而,这充其量只是一种美容的改善。你为什么认为这不是最好的方法?

我建议改用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 dictionarybar>>> print d{'foo': 'bar'}>>> r = d.setdefault('baz',18) #baz was never in the dictionary>>> print r #Now r has the value supplied above18>>> print d #The dictionary's been updated{'foo': 'bar', 'baz': 18}

#0测试#1中是否存在密钥:

d = {"key1": 10, "key2": 23}
if "key1" in d:print("this will execute")
if "nonexistent key" in d:print("this will not")

当键不存在时,使用#0提供默认值:

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

要为键提供默认值,请在每次赋值时使用#0

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

或者使用#1模块中的#0

from collections import defaultdict
d = defaultdict(int)
for i in range(10):d[i] += 1

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

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

在修改键之前检查它是否存在于字典中的一个常见用法是默认初始化值(例如,如果您的值是列表,并且您想确保有一个空列表,您可以在插入键的第一个值时附加该列表)。在这种情况下,您可能会发现#0类型很有趣。

在较旧的代码中,您可能还会发现has_key()的一些用法,这是一种不建议使用的检查字典中键是否存在的方法(只需使用key_name in dict_name即可)。

仅限Python 2:(Python 2.7已经支持'in')

您可以使用has_key()方法:

if dict.has_key('xyz')==1:# Update the value for the keyelse:pass

仅供参考添加到克里斯B的(最佳)答案

d = defaultdict(int)

也有效;原因是调用int()返回0,这是defaultdict在幕后(构建字典时)所做的事情,因此在留档中称为“工厂函数”。

使用EAFP(请求原谅比请求许可更容易):

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

查看其他Stack Overflow帖子:

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

  • 'key' in mydict耗时1.07秒
  • mydict.get('key')耗时1.84秒
  • mydefaultdict['key']耗时1.07秒

因此,建议使用indefaultdict反对get

您可以获得结果的方法是:

哪个更好取决于三件事:

  1. 字典是“通常有键”还是“通常没有键”。
  2. 你打算使用像if… this… elseif… this这样的条件吗?
  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."

Python中的字典有一个get('key', default)方法。所以你可以设置一个默认值,以防没有任何键。

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

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

>>> temp = {}
>>> help(temp.__contains__)
Help on built-in function __contains__:
__contains__(key, /) method of builtins.dict instanceTrue if D has a key k, else False.

使用python三元运算符

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

您可以使用for循环遍历字典并获取您想在字典中找到的键的名称。之后,使用if条件检查它是否存在:

dic = {'first' : 12, 'second' : 123}for each in dic:if each == 'second':print('the key exists and the corresponding value can be updated in the dictionary')

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

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中,0None或长度为零的对象的计算结果为False。其他所有值的计算结果为True。布尔运算从左到右进行计算,并返回操作数而不是True或False。

让我们看一个例子:

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

由于'Some string'的计算结果为True,因此or的其余部分不进行计算,并且不会出现除以零的错误。

但是如果我们切换顺序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'or

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

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

为了了解如何做到这一点,我们首先检查我们可以在字典上调用哪些方法。

以下是方法:

d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Python Dictionary clear()        Removes all ItemsPython Dictionary copy()         Returns Shallow Copy of a DictionaryPython Dictionary fromkeys()     Creates dictionary from given sequencePython Dictionary get()          Returns Value of The KeyPython Dictionary items()        Returns view of dictionary (key, value) pairPython Dictionary keys()         Returns View Object of All KeysPython Dictionary pop()          Removes and returns element having given keyPython Dictionary popitem()      Returns & Removes Element From DictionaryPython Dictionary setdefault()   Inserts Key With a Value if Key is not PresentPython Dictionary update()       Updates the DictionaryPython Dictionary values()       Returns view of all values in dictionary

检查密钥是否已经存在的残酷方法可能是get()方法:

d.get("key")

另外两个有趣方法items()keys()听起来工作量太大。所以让我们检查get()是否适合我们。我们有我们的判决d

d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

打印显示我们没有的密钥将返回None

print(d.get('key')) #Noneprint(d.get('clear')) #0print(d.get('copy')) #1

如果密钥存在或不存在,我们使用它来获取信息。但是,如果我们用单个key:None创建一个字典,请考虑这一点:

d= {'key':None}print(d.get('key')) #Noneprint(d.get('key2')) #None

导致get()方法在某些值可能是None的情况下不可靠。

这个故事应该有一个更快乐的结局。如果我们使用in比较器:

print('key' in d) #Trueprint('key2' in d) #False

我们得到了正确的结果。

我们可以检查Python字节码:

import disdis.dis("'key' in d")#   1           0 LOAD_CONST               0 ('key')#               2 LOAD_NAME                0 (d)#               4 COMPARE_OP               6 (in)#               6 RETURN_VALUE
dis.dis("d.get('key2')")#   1           0 LOAD_NAME                0 (d)#               2 LOAD_METHOD              1 (get)#               4 LOAD_CONST               0 ('key2')#               6 CALL_METHOD              1#               8 RETURN_VALUE

这表明in比较运算符不仅更可靠,而且比get()更快。