如何检查python中的dicts列表中是否存在密钥?

use*_*574 24 python python-2.7

假设我有一个如下所示的dicts列表:

[{1: "a"}, {2: "b"}]
Run Code Online (Sandbox Code Playgroud)

什么是pythonic方式来指示某个键是否在列表中的某个词组中?

DSM*_*DSM 59

我可能会写:

>>> lod = [{1: "a"}, {2: "b"}]
>>> any(1 in d for d in lod)
True
>>> any(3 in d for d in lod)
False
Run Code Online (Sandbox Code Playgroud)

虽然如果此列表中有大量的词汇,您可能需要重新考虑您的数据结构.

如果你想要找到第一个匹配的索引和/或字典,一种方法是使用nextenumerate:

>>> next(i for i,d in enumerate(lod) if 1 in d)
0
>>> next(d for i,d in enumerate(lod) if 1 in d)
{1: 'a'}
>>> next((i,d) for i,d in enumerate(lod) if 1 in d)
(0, {1: 'a'})
Run Code Online (Sandbox Code Playgroud)

StopIteration如果它不存在,这将提高:

>>> next(i for i,d in enumerate(lod) if 3 in d)
Traceback (most recent call last):
  File "<ipython-input-107-1f0737b2eae0>", line 1, in <module>
    next(i for i,d in enumerate(lod) if 3 in d)
StopIteration
Run Code Online (Sandbox Code Playgroud)

如果要避免这种情况,可以捕获异常或传递next默认值,如None:

>>> next((i for i,d in enumerate(lod) if 3 in d), None)
>>>
Run Code Online (Sandbox Code Playgroud)

正如@drewk的评论中所指出的,如果你想在多个值的情况下返回多个索引,你可以使用列表理解:

>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}]
>>> [i for i,d in enumerate(lod) if 2 in d]
[1, 2]
Run Code Online (Sandbox Code Playgroud)


Lyn*_*tel 6

要在单个字典中查看,我们使用“in”关键字:

key in dic_instance
Run Code Online (Sandbox Code Playgroud)

要检查字典列表,请迭代字典列表并使用“any”函数,因此如果在任何字典中找到键,则不会进一步迭代列表。

dic_list = [{1: "a"}, {2: "b"}]
any(2 in d for d in dic_list)
True
any(4 in d for d in dic_list)
False
Run Code Online (Sandbox Code Playgroud)