如何依据指定列表的顺序对字典列表按指定键排序?
问题描述
现有两个未排序列表:
list1 = ['d', 'a', 'c', 'b', 'e', 'g'] list2 = [{'key1':'a', 'key2': 'asdf'}, {'key1': 'f', 'key2': 'dd'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'd', 'key2': 'aa'}, {'key1': 'e', 'key2': 'aab'}]
需求如下:
- 对list2进行排序,使其中字典的
key1字段顺序与list1中的出现顺序一致 - 仅保留list1和list2共有的元素(list1中存在但list2没有的元素忽略,list2中存在但list1没有的元素剔除)
- 最终期望结果:
[{'key1': 'd', 'key2': 'aa'}, {'key1':'a', 'key2': 'asdf'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'e', 'key2': 'aab'}]
解决方案
通过建立顺序映射+过滤+排序三步即可实现需求,具体代码如下:
# 定义原始列表 list1 = ['d', 'a', 'c', 'b', 'e', 'g'] list2 = [{'key1':'a', 'key2': 'asdf'}, {'key1': 'f', 'key2': 'dd'}, {'key1': 'b', 'key2': 'afd'}, {'key1': 'c', 'key2': 'ff'}, {'key1': 'd', 'key2': 'aa'}, {'key1': 'e', 'key2': 'aab'}] # 1. 构建list1元素到其索引的映射,快速获取排序优先级 key_order = {key: idx for idx, key in enumerate(list1)} # 2. 过滤出list2中key1存在于list1的元素 filtered_items = [item for item in list2 if item['key1'] in key_order] # 3. 按照list1的顺序排序 sorted_list = sorted(filtered_items, key=lambda x: key_order[x['key1']]) # 输出结果 print(sorted_list)
思路说明
- 顺序映射:把list1的元素和对应索引绑定成字典,能以O(1)时间获取元素在list1中的位置,避免排序时反复遍历list1,提升效率。
- 元素过滤:用列表推导式直接筛选出两边共有的元素,自动剔除独有的内容。
- 按序排序:借助
sorted()函数,以元素key1在list1中的索引作为排序依据,最终得到符合要求的有序列表。
内容的提问来源于stack exchange,提问作者user67275
相关产品推荐
相关产品推荐

