如何在Python中检查键是否存在于字典列表中?

61

假设我有一个长得像这样的字典列表:

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

在列表中的某个字典中,指示特定键是否存在的Pythonic方式是什么?

7个回答

124

我可能会写:

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

如果在这个列表中将会有很多字典,你可能需要重新考虑你的数据结构。

如果你想要找到第一个匹配项所在的索引和/或字典,一种方法是使用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'})

如果找不到它,这将引发 StopIteration :

<code>>>> 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
</code>

如果你想避免这种情况,你可以捕获异常或将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]

如果它确实存在,我该如何获取它的索引/如果有几个,第一个的索引是什么?@DSM - user2057574
如果你想要整个字典输出,可以使用[(i,d) for i,d in enumerate(lod) if 2 in d]这样的代码。或者使用[i for i,d in enumerate(lod) if 2 in d]来获取索引列表。 - dawg

6
要查看单个字典,我们使用“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

4

可以使用生成器(generator)与任何函数(function)一起使用:

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

any函数会返回True,只要传递给它的iterable中至少有一个元素为True。但是你真的需要考虑,为什么不把所有的key: value对放在一个单独的dict中?


2
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
       self.parsedData.append(dataRow)

2
不是对我发布的问题的答案,但正是我所需要的。 - rob

1

您可以使用以下代码检查字典列表中是否存在某个键:<Key> in <Dictionary><Key> in <Dictionary>.keys()

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

# <Key> in <Dictionary>
print(any(1 in dict for dict in dict_list)) # True
print(any(3 in dict for dict in dict_list)) # False

# <Key> in <Dictionary>.keys()
print(any(1 in dict.keys() for dict in dict_list)) # True
print(any(3 in dict.keys() for dict in dict_list)) # False

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

-5

Python2和Python3的差异让我感到惊讶。我将根据我在Python3中最终采取的方法来回答这个问题。我的目标很简单:检查以字典格式返回的JSON响应是否出错。我的字典名为“token”,我要查找的键是“error”。

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

我正在寻找关键字“error”,如果没有找到,则将其设置为None的值,然后检查该值是否为None,如果是,则继续执行我的代码。使用else语句来处理如果我有关键字“error”的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接