Skip to main content
 首页 » 编程设计

python之如何根据另一个具有 key 的列表来订购字典列表

2025年05月04日13lonelyxmas

我有一些id如下:

req_ids=['964','123','534','645','876','222'] 

我从另一台服务器得到了这样的响应,没有任何特定的顺序:

res_result = [{'id':'123', 'name':'Sachin'}, 
              {'id':'534', 'name':'Vipin'}, 
              {'id':'222', 'name':'Ram'}, 
              {'id':'645', 'name':'Anoop'}, 
              {'id':'964', 'name':'Sani'}, 
              {'id':'876', 'name':'John'}] 

我需要以与 req_ids 相同的请求顺序获取 res_result,

    [{'id':'964', 'name':'Sani'}, 
     {'id':'123', 'name':'Sachin'}, 
     {'id':'534', 'name':'Vipin'}, 
     {'id':'645', 'name':'Anoop'}, 
     {'id':'876', 'name':'John'}, 
     {'id':'222', 'name':'Ram'}] 

如果可能的话,我该如何使用内置的 Python 函数而不是编写我们自己的循环来执行此逻辑?

请您参考如下方法:

如果您必须排序,将键映射到整数,然后使用该映射进行排序:

id_to_pos = {key: i for i, key in enumerate(req_ids)} 
sorted(res_result, key=lambda d: id_to_pos[d['id']]) 

演示:

>>> from pprint import pprint 
>>> req_ids = ['964', '123', '534', '645', '876', '222'] 
>>> res_result = [{'id':'123', 'name':'Sachin'}, 
...               {'id':'534', 'name':'Vipin'}, 
...               {'id':'222', 'name':'Ram'}, 
...               {'id':'645', 'name':'Anoop'}, 
...               {'id':'964', 'name':'Sani'}, 
...               {'id':'876', 'name':'John'}] 
>>> id_to_pos = {key: i for i, key in enumerate(req_ids)} 
>>> sorted(res_result, key=lambda d: id_to_pos[d['id']]) 
[{'id': '964', 'name': 'Sani'}, {'id': '123', 'name': 'Sachin'}, {'id': '534', 'name': 'Vipin'}, {'id': '645', 'name': 'Anoop'}, {'id': '876', 'name': 'John'}, {'id': '222', 'name': 'Ram'}] 
>>> pprint(_) 
[{'id': '964', 'name': 'Sani'}, 
 {'id': '123', 'name': 'Sachin'}, 
 {'id': '534', 'name': 'Vipin'}, 
 {'id': '645', 'name': 'Anoop'}, 
 {'id': '876', 'name': 'John'}, 
 {'id': '222', 'name': 'Ram'}] 

但是,您可以完全避免排序,您已经有正确的顺序,您只需要将 id 键映射到字典 (O(N)),然后以正确的顺序取出字典(仍然是 O(N)):

id_to_dict = {d['id']: d for d in res_result} 
[id_to_dict[id] for id in req_ids] 

演示:

>>> id_to_dict = {d['id']: d for d in res_result} 
>>> [id_to_dict[id] for id in req_ids] 
[{'id': '964', 'name': 'Sani'}, {'id': '123', 'name': 'Sachin'}, {'id': '534', 'name': 'Vipin'}, {'id': '645', 'name': 'Anoop'}, {'id': '876', 'name': 'John'}, {'id': '222', 'name': 'Ram'}] 
>>> pprint(_) 
[{'id': '964', 'name': 'Sani'}, 
 {'id': '123', 'name': 'Sachin'}, 
 {'id': '534', 'name': 'Vipin'}, 
 {'id': '645', 'name': 'Anoop'}, 
 {'id': '876', 'name': 'John'}, 
 {'id': '222', 'name': 'Ram'}]