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

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

1
2
3
4
if 'key1' in dict.keys():
  print"blah"
else:
  print"boo"

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


in是测试dict中是否存在键的方法。

1
2
3
4
5
6
7
8
d = dict()

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

如果你想要一个默认值,你可以使用dict.get():

1
2
3
4
5
d = dict()

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

…如果你想确保任何键的默认值,你可以从collections模块中使用defaultdict,就像这样:

1
2
3
4
5
6
from collections import defaultdict

d = defaultdict(lambda: 0)

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

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


你不需要调用键:

1
2
3
4
if 'key1' in dict:
  print"blah"
else:
  print"boo"

这将会快得多,因为它使用字典的哈希,而不是线性搜索,调用键就可以做到这一点。


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

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

检查关键的存在的一种常见用法在字典变异是default-initialize价值(例如,如果你的值列表,例如,和你想要确保有一个空列表,你可以添加时插入第一个值的键)。在这种情况下,您可能会发现collections.defaultdict()类型很有趣。

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


你可以把它缩短:

1
2
if 'key1' in dict:
    ...

然而,这充其量只是表面上的改善。为什么你认为这不是最好的方法?


我建议使用setdefault方法。听起来它会做你想做的一切。

1
2
3
4
5
6
7
8
9
10
11
>>> 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}


有关接受答案的建议方法(10m循环)的速度执行的额外信息:

'key' in mydict运行时间1.07秒mydict.get('key')运行时间1.84秒mydefaultdict['key']运行时间1.07秒

因此,建议对get使用indefaultdict


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

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

使用EAFP(请求原谅比请求许可更容易)怎么样?

1
2
3
4
5
try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

参见其他SO帖子:

在python或中使用try vs if

检查Python中的成员是否存在


使用三元运算符:

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


检查时可以使用has_key()方法

1
2
if dict.has_key('key1'):
   print"it is there"

如果您想要一个值,那么您可以使用get()方法

1
a = dict.get('key1', expeced_type)

如果您想要一个元组、列表、字典或任何字符串作为默认值作为返回值,那么使用get()方法

1
a = dict.get('key1', {}).get('key2', [])


你得到结果的方法是:

如果在python3中删除了your_dict.has_key(key)如果输入你的字典try /除了块

哪一个更好取决于三件事:

字典是"通常有键"还是"通常没有键"。你打算使用if…else…else…else这样的条件吗?字典有多大?

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

用try/block代替in或if:

1
2
3
4
5
6
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."


您可以使用has_key()方法:

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

dict.get方法设置默认值,如果没有找到:

1
2
3
4
5
6
7
mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0


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

1
d = defaultdict(int)

作品;原因是调用int()返回0,而这正是defaultdict在幕后(构造字典时)所做的,因此在文档中名为"Factory Function"。


print dict.get('key1', 'blah')

不会为dict中的值打印boo,而是通过打印key1的值来确认它的存在,从而实现该目标。


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

1
2
3
4
5
6
7
8
 >>> 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.


要检查给定的键是否存在于字典中,您应该使用以下任何一种方法:

Approach One (working in Python 3):

1
2
3
4
5
6
def checkKey(dict, key):    
    if key in dict.keys():
        print("Key is here,", end ="")
        print("value =", dict[key])
    else:
        print("Key isn't present.")

让我们检查一下:

1
2
3
4
5
6
7
dict = {'r': 30, 'g':59, 'b':11}

key = 'b'
checkKey(dict, key)

key = 'a'
checkKey(dict, key)

由于Approach One:

1
2
# Key is here, value = 11
# Key isn't present.

Approach Two (working in Python 3):

1
2
3
4
5
6
def checkKey(dict, key):  
    if key in dict:
        print("Key is here,", end ="")
        print("value =", dict[key])
    else:
        print("Key isn't present.")

我们也来检查一下:

1
2
3
4
5
6
7
dict = {'x': 10, 'y':20, 'z':30}

key = 'y'
checkKey(dict, key)

key = 'u'
checkKey(dict, key)

由于Approach Two:

1
2
# Key is here, value = 20
# Key isn't present.

Approach Three (working in Python 3):

1
2
3
4
5
def checkKey(dict, key):      
    if dict.has_key(key):
        print"Key is here, value =", dict[key]
    else:
        print"Key isn't present."

我们也来检查一下:

1
2
3
4
5
6
7
dict = {'u': 0, 'v':1, 'w':2}

key = 'u'
checkKey(dict, key)

key = 'm'
checkKey(dict, key)

由于Approach Three:

1
2
# Key is here, value = 0
# Key isn't present.

希望这个有帮助。


嗯. .您将熟悉在列表或数据中搜索元素的存在性意味着遍历所有内容(至少对于无序列表e)。g dict.keys)。因此,我们可以使用异常和通常出现的错误来避免这种复杂性……

1
2
3
4
5
6
d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")

我用try/except;如果抛出异常,则在字典中不存在键。例子:

1
2
3
4
5
6
st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'


最简单的一个是,如果你知道要查找哪个键(键名):

1
2
3
4
5
# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

或者你也可以这样做:

1
2
if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something


你可以使用for循环进入字典的每个元素,得到你想要在字典中找到的名字,然后检查它是否存在:

1
2
3
4
5
6
dic={‘first’ : 12, ‘second’ : 123}
For each in dic :
If each == ‘second’:
    Print (‘it is exist’)
else :
     print (not exist’)

为什么不直接使用has_key()方法呢?

1
2
3
4
5
a = {}
a.has_key('b') => #False

a['b'] = 8
a.has_key('b') => #True