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

时间:2009-10-21 19:05:10

标签: python dictionary

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

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

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

16 个答案:

答案 0 :(得分:2737)

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

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

from collections import defaultdict

d = defaultdict(int)

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

...但一般来说,in关键字是最好的方式。

答案 1 :(得分:1347)

您无需拨打密钥:

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

这将是faster,因为它使用字典的散列而不是进行线性搜索,而调用键则会这样做。

答案 2 :(得分:248)

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

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

在变更之前检查字典中是否存在密钥的常见用法是默认初始化值(例如,如果您的值是列表,并且您希望确保有一个空列表,插入键的第一个值时可以追加)。在这种情况下,您可能会发现感兴趣的collections.defaultdict()类型。

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

答案 3 :(得分:87)

你可以缩短这个:

if 'key1' in dict:
    ...

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

答案 4 :(得分:44)

我建议改用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}

答案 5 :(得分:43)

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

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

因此建议针对in使用defaultdictget

答案 6 :(得分:42)

python中的词典有一个get('key',default)方法。所以你可以设置一个默认值,以防没有密钥。

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

答案 7 :(得分:27)

如何使用EAFP(更容易请求宽恕而不是许可):

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

参见其他SO帖子:

Using try vs if in python

Checking for member existence in Python

答案 8 :(得分:21)

使用三元运算符:

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

答案 9 :(得分:15)

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

  • 如果your_dict.has_key(key)Removed in Python 3
  • 如果在your_dict中输入密钥
  • try / except block

哪个更好取决于3件事:

  1. 字典通常是否有密钥&#39;或者&#39;通常没有密钥&#39;。
  2. 您是否打算使用if ...... else ... elseif ...... else?
  3. 等条件
  4. 字典有多大?
  5. 阅读更多:http://paltman.com/try-except-performance-in-python-a-simple-test/

    在&#39;中使用try / block代替&#39;或者&#39;如果&#39;:

    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."
    

答案 10 :(得分:14)

只是一个FYI加入Chris。 B(最佳答案):

d = defaultdict(int)

也适用;原因是调用int()会返回0,这是defaultdict在幕后所做的事情(构建字典时),因此文档中的名称为“Factory Function”。

答案 11 :(得分:13)

仅限Python 2 :(并且python 2.7已经支持in

你可以使用has_key()方法:

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

答案 12 :(得分:4)

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.

答案 13 :(得分:3)

还提供了一种使用布尔运算符检查密钥是否存在的方法。

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'。因此,我们得到结果并用or'boo'

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

答案 14 :(得分:0)

您可以使用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')

答案 15 :(得分:0)

  

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

要了解如何做到这一点,我们首先检查可以在字典上调用的方法。 方法如下:

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 Items
Python Dictionary copy()        Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys()    Creates dictionary from given sequence
Python Dictionary get()         Returns Value of The Key
Python Dictionary items()       Returns view of dictionary (key, value) pair
Python Dictionary keys()        Returns View Object of All Keys
Python Dictionary pop()         Removes and returns element having given key
Python Dictionary popitem()     Returns & Removes Element From Dictionary
Python Dictionary setdefault()  Inserts Key With a Value if Key is not Present
Python Dictionary update()      Updates the Dictionary 
Python 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')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1

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

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

在某些值可能为get()的情况下,导致None方法不可靠。 这个故事的结局应该更快乐。如果我们使用in比较器:

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

我们得到正确的结果。 我们可能会检查Python字节码:

import dis
dis.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()更可靠,而且甚至更快。