如何检查字典中是否存在某个值?

352 投票
7 回答
782737 浏览
提问于 2025-04-17 06:46

我在Python中有一个字典:

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

我需要一种方法来检查像“one”或“two”这样的值是否存在于这个字典里。

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

"1" in d

然后Python会告诉我这个判断是对还是错。不过我需要做的正是这个,只不过是要检查一个值是否存在。

7 个回答

33

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 的情况。

52

在Python 3中,你可以使用

"one" in d.values()

来检查"one"是否在你的字典的值里面。

而在Python 2中,使用

"one" in d.itervalues()

会更有效率。

需要注意的是,这个方法会逐个检查字典里的值,一旦找到就会停止,所以比起检查某个键是否存在,这种方法效率要低很多。

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

编辑2:根据评论中的请求...

>>> 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]

撰写回答