Python 检查字典键是否存在并处理其值的最有效方法

Python 检查字典键是否存在并处理其值的最有效方法,python,performance,dictionary,Python,Performance,Dictionary,我可以通过以下几种方式做到这一点: MyDict = {'key1':'value1', 'key2':'value2'} 或 或 或 或者我尝试了类似的方法,但在python中它不能像这样工作 try: var1=MyDict['key1] except KeyError, e: pass 我们可能会想出更多的工作方法来做到这一点。 在计算速度方面,哪种方法最有效?您的这一种方法非常快: if v=MyDict.get('key1'): var1=v 假设

我可以通过以下几种方式做到这一点:

MyDict = {'key1':'value1', 'key2':'value2'}

或者我尝试了类似的方法,但在python中它不能像这样工作

try: 
   var1=MyDict['key1]
except KeyError, e:
   pass
我们可能会想出更多的工作方法来做到这一点。
在计算速度方面,哪种方法最有效?

您的这一种方法非常快:

if v=MyDict.get('key1'):
       var1=v
假设字典中的项目和散列有某些条件,这

假设您不希望仅在设置了
MyDict[“key1”]
的情况下定义
var1=MyDict.get(“key1”,default=some\u sentinel\u或\u default\u值)

wrt/性能,这主要取决于你是否期望“key1”在大多数时候出现在你的dict中。如果是第一个,try/except块可能会更快,否则会更慢(try/except块的设置成本较低,但在出现实际异常时成本较高)


如果您真的非常担心性能,我建议您使用
timeit
模块在实际数据上测试各种选项

为您提供一个小基准(ipython):

结论:dict中的构造
键通常最快,只有在有效键的情况下通过
try而优于
,因为如果
操作,它不会执行


(请注意,
try except
对于无效密钥的速度要慢得多:因此,由于您不知道密钥是否有效,因此如果给定有效与无效的未知概率,请坚持dict中的
密钥。

dict.has_key()
已被弃用,并在Python 3中消失)。不要使用它。你的例子不尽相同。前两个检查字典是否有一个特定的键,而第三个测试该键的布尔值(并假设它在那里)。@iCodez但在这种情况下,空值将解析为False,非空值解析为True-这同样有效,假设我的值中不使用0、False或None。正确吗?如果
'key1'
不是字典中的项目,则前两个示例可以正常工作,而第三个示例将引发
KeyError
异常。该键多长时间会丢失一次?是的,这很重要。这不是我想要的。我只想在有键的情况下触摸var1(var1可能会更早设置)。每次键不存在时,您的方法都会用默认值覆盖var1。然后使用
var1=MyDict.get(“key1”,var1)
。如果您能确保值真实。将
var1=d.get(k,无);如果var1:…
更快?我想指出,如果密钥无效,try:except:的性能最差。1.07微秒>132纳秒。我不明白答案中的“优于”是什么,当密钥不存在时,相差超过800ns,当密钥存在时,相差20ns赞成try/except。@因为我刚刚用60k密钥测试了这个问题,try except花了1秒,而d中的k花了61秒。记住,
。has\u key
不在python3.8或python3.9中(对于较旧的Python 3,不是100%)
if MyDict['key1']:
    var1=MyDict['key1']
try: 
   var1=MyDict['key1]
except KeyError, e:
   pass
if v=MyDict.get('key1'):
       var1=v
if 'key1' in MyDict:
       var1 = MyDict['key1']
In [1]: def test_1(d, k):
   ...:     if k in d:
   ...:         var1 = d[k]
   ...:         

In [2]: def test_2(d, k):
   ...:     if d.has_key(k):
   ...:         var1 = d[k]
   ...:         

In [3]: def test_3(d, k):
   ...:     try:
   ...:         var1 = d[k]
   ...:     except KeyError as e:
   ...:         pass
   ...:     

In [4]: def test_4(d, k):
   ...:     if d.get(k):
   ...:         var1 = d[k]
   ...:         

In [5]: my_dict = {'key{}'.format(i): 'value{}'.format(i) for i in range(1000)}

In [6]: key_valid = "key5"

In [7]: key_non_valid = "key"

In [8]: %timeit test_1(my_dict, key_valid)
10000000 loops, best of 3: 172 ns per loop

In [9]: %timeit test_1(my_dict, key_non_valid)
10000000 loops, best of 3: 132 ns per loop

In [10]: %timeit test_2(my_dict, key_valid)
1000000 loops, best of 3: 211 ns per loop

In [11]: %timeit test_2(my_dict, key_non_valid)
10000000 loops, best of 3: 171 ns per loop

In [12]: %timeit test_3(my_dict, key_valid)
10000000 loops, best of 3: 151 ns per loop

In [13]: %timeit test_3(my_dict, key_non_valid)
1000000 loops, best of 3: 1.07 µs per loop

In [14]: %timeit test_4(my_dict, key_valid)
1000000 loops, best of 3: 246 ns per loop

In [15]: %timeit test_4(my_dict, key_non_valid)
10000000 loops, best of 3: 189 ns per loop