我有一个dicts列表:
list = [{'id':'1234','name':'Jason'},
{'id':'2345','name':'Tom'},
{'id':'3456','name':'Art'}]
Run Code Online (Sandbox Code Playgroud)
如何通过匹配name ='Tom'来有效地找到索引位置[0],[1]或[2]?
如果这是一维列表我可以做list.index()但我不知道如何继续搜索列表中的dicts的值.
tok*_*and 131
tom_index = next((index for (index, d) in enumerate(lst) if d["name"] == "Tom"), None)
# 1
Run Code Online (Sandbox Code Playgroud)
如果你需要从名称中重复获取,你应该按名称索引它们(使用字典),这样获取操作将是O(1)时间.一个主意:
def build_dict(seq, key):
return dict((d[key], dict(d, index=index)) for (index, d) in enumerate(seq))
info_by_name = build_dict(lst, key="name")
tom_info = info_by_name.get("Tom")
# {'index': 1, 'id': '2345', 'name': 'Tom'}
Run Code Online (Sandbox Code Playgroud)
Emi*_*ile 40
简单易读的版本是
def find(lst, key, value):
for i, dic in enumerate(lst):
if dic[key] == value:
return i
return -1
Run Code Online (Sandbox Code Playgroud)
它不会有效,因为您需要遍历列表检查其中的每个项目(O(n)).如果你想要效率,你可以使用dicts的dict.关于这个问题,这里有一种可能的方法来找到它(但是,如果你想坚持这个数据结构,使用生成器实际上更有效,正如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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95685 次 |
| 最近记录: |