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

时间:2013-02-09 20:02:15

标签: python python-2.7

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

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

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

6 个答案:

答案 0 :(得分:46)

我可能会写:

>>> 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不存在,则会>>> 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) >>>

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

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

{{1}}

答案 1 :(得分:2)

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

>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True
如果传递给any的{​​{1}}中的至少一个元素为True,则

iterable函数返回True。但是你真的需要考虑,为什么你没有在一个key: value中拥有所有dict对?

答案 2 :(得分:1)

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

答案 3 :(得分:0)

要查看单个dictoray,我们使用'in'关键字:

key in dic_instance

要检入字典列表,遍历字典列表并使用“任何”功能,因此如果在任何字典中找到密钥,它将不会进一步迭代列表。

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 :(得分: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 :(得分:-1)

我被python2 vs python3的可能吓了一跳。我将根据最终对python3所做的回答。我的目标很简单:检查字典格式的json响应是否给出错误。我的字典叫做“令牌”,我要寻找的密钥是“错误”

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

我正在寻找键“错误”,如果它不存在,则将其设置为“无”,然后检查其值为“无”,如果是,则继续执行我的代码。如果没有键“ error

,则使用其他语句来处理