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

174 投票
12 回答
198412 浏览
提问于 2025-04-16 08:15

我有一个字典列表:

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

我该如何高效地找到索引位置 [0]、[1] 或 [2],通过匹配名字为 'Tom' 的项呢?

如果这是一个一维的列表,我可以用 list.index() 来找到,但我不太确定怎么在这个列表中的字典里搜索值。

12 个回答

14

这样做效率不高,因为你需要遍历整个列表,检查里面的每一个项目(这叫O(n)复杂度)。如果你想要更高的效率,可以使用字典的字典。关于这个问题,这里有一种可能的解决方法(不过,如果你想坚持使用这种数据结构,其实使用生成器会更高效,正如Brent Newey在评论中提到的;也可以看看tokland的回答):

>>> L = [{'id':'1234','name':'Jason'},
...         {'id':'2345','name':'Tom'},
...         {'id':'3456','name':'Art'}]
>>> [i for i,_ in enumerate(L) if _['name'] == 'Tom'][0]
1
73

一个简单易读的版本是

def find(lst, key, value):
    for i, dic in enumerate(lst):
        if dic[key] == value:
            return i
    return -1
210
lst = [{'id':'1234','name':'Jason'}, {'id':'2345','name':'Tom'}, {'id':'3456','name':'Art'}]

tom_index = next((index for (index, d) in enumerate(lst) if d["name"] == "Tom"), None)
# 1
def build_dict(seq, key):
    return dict((d[key], dict(d, index=index)) for (index, d) in enumerate(seq))

people_by_name = build_dict(lst, key="name")
tom_info = people_by_name.get("Tom")
# {'index': 1, 'id': '2345', 'name': 'Tom'}

如果你需要经常根据名字来获取数据,最好用名字来建立索引(可以用字典)。这样的话,获取数据的速度就会非常快,时间复杂度是O(1)。这里有个思路:

撰写回答