如何根据另一个具有键的列表来排序词典列表?

2024-06-16 09:57:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些身份证如下:

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相同的请求顺序获取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函数,而不是编写我们自己的循环来完成这个逻辑呢


Tags: name服务器idids顺序resresultjohn
2条回答
>>> map({d['id']: d for d in res_result}.__getitem__, 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'}]

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

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'}]

相关问题 更多 >