如何基于另一列表的指定顺序对Python字典列表排序?
基于外部列表排序字典列表(值相等时保留原顺序)
问题场景
需要根据外部列表的排序规则对字典列表进行排序,外部列表仅提供排序依据,与字典列表元素无直接关联。示例如下:
a = [{"a": 5}, {"b": 5}, {"j": {}}, {123: "z"}] b = [8, 4, 4, 3]
期望按b的升序排序a,输出结果:
[{123: "z"}, {"b": 5}, {"j": {}}, {"a": 5}]
尝试使用sorted(zip(b, a))时触发报错:当b中存在相等值,排序会尝试比较对应的字典,而Python 3不支持字典直接比较:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[497], line 1 ----> 1 sorted(zip(b, a)) TypeError: '<' not supported between instances of 'dict' and 'dict'
要求b值相等时,保留元素在原列表中的顺序。
解决方案
最优方案:绑定原始索引排序
利用enumerate给每个字典绑定原始索引,排序时仅以b中对应位置的值为依据,同时借助Pythonsorted的稳定排序特性,保证b值相等时元素保留原顺序:
a = [{"a": 5}, {"b": 5}, {"j": {}}, {123: "z"}] b = [8, 4, 4, 3] # 生成(索引, 字典)的元组列表,按b[索引]排序后提取字典 sorted_result = [elem for idx, elem in sorted(enumerate(a), key=lambda x: b[x[0]])] print(sorted_result)
输出:
[{123: 'z'}, {'b': 5}, {'j': {}}, {'a': 5}]
原理说明
enumerate(a)为每个字典绑定了它在原列表中的索引,彻底避免了直接比较字典的操作;- 排序的
key仅使用b中对应索引的值,当b值相等时,sorted会保持元素的原始顺序(稳定排序),完全符合需求。
避坑提示
不要直接使用sorted(a, key=lambda x: b[a.index(x)]):当a中存在重复字典时,a.index(x)会返回第一个匹配的索引,导致排序逻辑错误,绑定原始索引的方案更可靠。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

