如何检查字典(python)中是否存在值
我有以下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中,它
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