You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何依据指定列表的顺序对字典列表按指定键排序?

问题描述

现有两个未排序列表:

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)

思路说明

  1. 顺序映射:把list1的元素和对应索引绑定成字典,能以O(1)时间获取元素在list1中的位置,避免排序时反复遍历list1,提升效率。
  2. 元素过滤:用列表推导式直接筛选出两边共有的元素,自动剔除独有的内容。
  3. 按序排序:借助sorted()函数,以元素key1在list1中的索引作为排序依据,最终得到符合要求的有序列表。

内容的提问来源于stack exchange,提问作者user67275

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:11:30