50

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

[{1: "a"}, {2: "b"}]

指示某个键是否在列表中的一个字典中的pythonic方法是什么?

4

6 回答 6

104

我可能会写:

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

尽管如果此列表中有很多字典,您可能需要重新考虑您的数据结构。

如果您想要找到第一个匹配项的索引和/或字典,一种方法是使用nextand enumerate

>>> 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'})

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

如果您想避免这种情况,您可以捕获异常或传递next一个默认值,例如None

>>> next((i for i,d in enumerate(lod) if 3 in d), None)
>>>

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

>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}]
>>> [i for i,d in enumerate(lod) if 2 in d]
[1, 2]
于 2013-02-09T20:04:51.253 回答
5

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

key in dic_instance

要签入字典列表,遍历字典列表并使用'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
于 2017-06-23T10:34:29.837 回答
3

any函数与生成器一起使用:

>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True

any函数返回,如果传递给它True的至少一个元素是。但是你真的需要考虑,为什么你没有把所有的对放在一个单子里?iterableTruekey: valuedict

于 2013-02-09T20:05:10.177 回答
2
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
       self.parsedData.append(dataRow)
于 2015-01-16T05:26:34.040 回答
0

为了搜索深度嵌套的数据结构,我使用此代码递归查找列表和字典中的键

def isKey(dictORlist, key):
# dictORlist is the data structure you want to search
# key is the keyword you want to search for
def checkList(List, key):
    if isinstance(List, list):
        for i in List:
             return isKey(i, key)

result = checkList(dictORlist, key)
if isinstance(dictORlist, dict):
    for k in dictORlist.keys():
        data = dictORlist[k]
        if k == key:
            return True
        elif isinstance(data, dict):
            result = isKey(data, key)
        else:
            result = checkList(data, key)

if result == None:
    result = False
return result
于 2019-05-12T10:37:55.283 回答
-3

我对 python2 与 python3 中可能发生的事情感到震惊。我将根据我最终为 python3 所做的事情来回答它。我的目标很简单:检查字典格式的 json 响应是否出错。我的字典被称为“令牌”,我正在寻找的密钥是“错误”

if ((token.get('error', None)) is None):
    do something

我正在寻找关键的“错误”,如果它不存在,则将其设置为 None,然后检查该值是否为 None,如果是,请继续我的代码。一个 else 语句来处理 if 我确实有密钥“错误”

于 2020-01-03T16:18:41.853 回答