如何检查字典(python)中是否存在值

如何检查字典(python)中是否存在值,python,dictionary,find,Python,Dictionary,Find,我有以下python字典: d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'} 我需要一种方法来查找此字典中是否存在“1”或“2”之类的值 例如,如果我想知道索引“1”是否存在,我只需键入: "1" in d 然后python会告诉我这是真是假,但是我需要做同样的事情,除了找到一个值是否存在 "one" in d.values() 测试字典的值中是否有“one” 在Python2中,它

我有以下python字典:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
我需要一种方法来查找此字典中是否存在“1”或“2”之类的值

例如,如果我想知道索引“1”是否存在,我只需键入:

"1" in d

然后python会告诉我这是真是假,但是我需要做同样的事情,除了找到一个值是否存在

"one" in d.values()
测试字典的值中是否有“one”

在Python2中,它的使用效率更高

"one" in d.itervalues()
相反

请注意,这会触发对字典值的线性扫描,一旦发现就会短路,因此这比检查是否存在密钥的效率要低得多

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True
出于好奇,一些比较时间:

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]
编辑:如果你想知道为什么。。。原因是上述每种方法都会返回不同类型的对象,这些对象可能适合也可能不适合查找操作:

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>
使用字典视图:

if x in d.viewvalues():
    dosomething()..
Python字典具有多种功能

比如说,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
None
如果您的密钥不存在,将返回
None
值。

与3.0以下版本和5.0以上版本相关的内容


在Python 3中,您可以使用字典的
values()
函数。它返回值的视图对象。这反过来又可以传递给
iter
函数,该函数返回一个迭代器对象。可以使用中的
检查迭代器,如下所示

iter中的“一”(d.values())
也可以直接使用视图对象,因为它类似于列表

'one' in d.values()

检查值存在的不同类型

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False
如果值的列表

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True
如果包含字符串值的值列表

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

我手头没有python,你能用'four'而不是'one'来重新运行测试吗?毕竟没有必要,除非在更大的dict上运行。我猜values()中的开销是由复制值列表引起的,而viewvalues()中的开销是由保持视图活动引起的。考虑到
d
的小尺寸,计时实际上毫无意义。在Python3中,默认情况下,
dict.values()
是一个字典视图,
dict.itervalues()
dict.viewvalues()
不存在。您可以重新测试它(使用更大的字典),并使用
list(d.values())
来获得Python 2行为,使用
iter(d.values())
来获得
dict.itervalues()
行为,但由于这两个版本都需要全局查找和调用,因此它们的速度绝对较慢。两者都做不需要的额外工作,但都不能回答问题。OP询问了
key:value
和not key中的值。在字典视图中使用
iter()
没有任何意义<中的code>将已将该对象用作iterable(该类型未实现专用的
\uuuuu包含\uuuu
方法)。iter中的
'one(d.values())
'one(d.values()
之间的唯一区别是,您让Python做了额外的工作(为
iter
支付全局查找的费用)。不要在[…列表理解超过顺序…]中使用
,使用
任何(顺序中的值…
,为了避免创建不用于任何其他用途的列表对象,以及在找到值时短路。我知道这是一个非常古老的答案,但我只想指出,在Python 3中,它是
values()
,而不是
itervalues()
。我进入了白痴模式一段时间,试图让
itervalues()
在Python 3中工作,然后才意识到我是个白痴。@digitalformula谢谢,我更新了答案以使其更有用。@digitalformula这也正是我遇到的陷阱,非常感谢
d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False
test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True
test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True