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


251

我在python中有以下字典:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

我需要一种方法来查找此字典中是否存在诸如“一个”或“两个”的值。

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

"1" in d

然后python会告诉我这是对还是错,但是我需要做同样的事情,只是要找到一个值是否存在。

Answers:


381
>>> 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'>

EDIT2:根据注释中的请求...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

我手头没有python,可以用“四个”而不是“一个”重新运行测试吗?
soulcheck 2011年

2
毕竟,除非采取更大的命令,否则根本就没有必要。我猜values()中的开销是由于复制值列表而造成的,而viewvalues()中的开销是通过使视图保持活动状态引起的。
soulcheck

由于的大小较小d,因此计时实际上是没有意义的。在Python 3中,dict.values()默认情况下是一个字典视图,并且dict.itervalues()and dict.viewvalues()消失了。您可以重新测试它(使用更大的字典),并使用它list(d.values())来获取Python 2行为并iter(d.values())获取dict.itervalues()行为,但是由于这两个版本都需要全局查找和调用,因此它们绝对会变慢。两者都执行不需要的额外工作。
马丁·彼得斯


23

Python字典具有get(key)函数

>>> d.get(key)

例如,

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

如果您的密钥不存在,将返回none值。

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

与小于3.0和大于5.0的版本相关的内容。。


29
不回答问题。OP询问了一个in中的值,key:value而不是键。
akshaynagpal


4

不同类型检查值是否存在

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

不要使用value in [... list comprehension over sequence ...],使用any(value in sequence ...),避免创建您不用于其他任何事项的列表对象,并避免在找到该值时短路。
马丁·彼得斯

0

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

'one' in iter(d.values())

或者您可以直接使用视图对象,因为它类似于列表

'one' in d.values()

1
没有点在使用iter()上的字典视图; in将已经将该对象用作可迭代对象(该类型未实现专用__contains__方法)。'one' in iter(d.values())和之间的唯一区别'one in d.values()是,您让Python做了额外的工作(支付的全局查找费用iter)。
马丁·彼得斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.