<p>使用</p>
<pre><code>if key in d and d[key] == value:
</code></pre>
<p>或(仅在Python3中)</p>
<pre><code>if (key, value) in d.items():
</code></pre>
<p>在Python 3中,<code>d.items()</code>返回一个<a href="https://docs.python.org/3.4/library/stdtypes.html#dictionary-view-objects" rel="nofollow">Dictionary view object</a>,它支持快速的成员资格测试。在Python 2中,<code>d.items()</code>返回一个列表,该列表创建速度慢,测试成员身份也慢。Python 2.7是一个特殊情况,在这里您可以使用<code>d.viewitems()</code>,并获得与Python 3中的<code>d.items()</code>相同的结果。</p>
<p><strong>编辑:</strong>在注释中,您表示出于性能原因,您更喜欢<code>checkKeyValuePairExistence</code>而不是<code>key in d and d[key] == value</code>。下面是一些计时,显示<code>checkKeyValuePairExistence</code>总是慢一些(在我的系统上,当键值对存在时大约慢2倍,当键值对不存在时则慢16倍)。我还测试了越来越大的字典,发现时间变化不大。</p>
<pre><code>>>> import random
>>> from timeit import timeit
>>> def checkKeyValuePairExistence(dic, key, value):
... try:
... return dic[key] == value
... except KeyError:
... return False
...
>>> d = {random.randint(0, 100000):random.randint(0, 100000) for i in range(1000)}
>>> setup = 'from __main__ import k, d, v, checkKeyValuePairExistence'
>>> test_try_except = 'checkKeyValuePairExistence(d, k, v)'
>>> test_k_in_d_and = 'k in d and d[k] == v'
>>> k, v = random.choice(d.items()) # to test if found
>>> timeit(test_try_except, setup=setup)
0.1984054392365806
>>> timeit(test_k_in_d_and, setup=setup)
0.10442071140778353
>>> k = -1 # test if not found
>>> timeit(test_try_except, setup=setup)
1.2896073903002616
>>> timeit(test_k_in_d_and, setup=setup)
0.07827843747497809
</code></pre>