首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过匹配字典的值,在列表中查找字典的索引

通过匹配字典的值,在列表中查找字典的索引
EN

Stack Overflow用户
提问于 2010-12-09 04:00:36
回答 10查看 143.9K关注 0票数 148

我有一个字典列表:

list = [{'id':'1234','name':'Jason'},
        {'id':'2345','name':'Tom'},
        {'id':'3456','name':'Art'}]

如何通过匹配name = 'Tom‘有效地找到索引位置1或2?

如果这是一个一维列表,我可以执行list.index(),但是我不确定如何在列表中搜索字典的值。

EN

回答 10

Stack Overflow用户

发布于 2010-12-09 04:29:30

一个简单的可读性版本是

def find(lst, key, value):
    for i, dic in enumerate(lst):
        if dic[key] == value:
            return i
    return -1
票数 64
EN

Stack Overflow用户

发布于 2015-04-14 06:51:57

使用过滤器/索引组合似乎是最符合逻辑的:

names=[{}, {'name': 'Tom'},{'name': 'Tony'}]
names.index(next(filter(lambda n: n.get('name') == 'Tom', names)))
1

如果你认为可能有多个匹配:

[names.index(item) for item in filter(lambda n: n.get('name') == 'Tom', names)]
[1]
票数 4
EN

Stack Overflow用户

发布于 2020-02-11 01:16:08

@faham提供的答案是一个很好的一行代码,但它不会返回包含值的字典的索引。相反,它返回字典本身。下面是一种简单的获取方法:如果有多个索引,则显示一个或多个索引列表;如果没有索引,则显示一个空列表:

list = [{'id':'1234','name':'Jason'},
        {'id':'2345','name':'Tom'},
        {'id':'3456','name':'Art'}]

[i for i, d in enumerate(list) if 'Tom' in d.values()]

输出:

>>> [1]

我喜欢这种方法的原因是,通过简单的编辑,您可以获得元组形式的索引和字典的列表。这就是我需要解决的问题,并找到了这些答案。在下面的代码中,我在另一个字典中添加了一个重复值,以显示它是如何工作的:

list = [{'id':'1234','name':'Jason'},
        {'id':'2345','name':'Tom'},
        {'id':'3456','name':'Art'},
        {'id':'4567','name':'Tom'}]

[(i, d) for i, d in enumerate(list) if 'Tom' in d.values()]

输出:

>>> [(1, {'id': '2345', 'name': 'Tom'}), (3, {'id': '4567', 'name': 'Tom'})]

此解决方案查找所有字典的任何值中都包含“Tom”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4391697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档