我有一个字典列表:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
如何通过匹配name = 'Tom‘有效地找到索引位置1或2?
如果这是一个一维列表,我可以执行list.index(),但是我不确定如何在列表中搜索字典的值。
发布于 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
发布于 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]
发布于 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”。
https://stackoverflow.com/questions/4391697
复制相似问题