如何在Python中依据指定有序列表对多个列表进行排序?
问题描述
现有以下三个列表:
List1=['Canis_lupus','Cattus_catus','Mus_musculus','Rattus_rattus','Bombyx'] List2=['Homo_sapiens','Homo_erectus','Pan_troglodys'] List3=['Cattus_cattus','Bombyx','Homo_erectus','Mus_musculus']
同时有一个预定义的有序参考列表,包含所有可能出现的元素:
Ordered_list=['Cattus_cattus','Bombyx','Mus_musculus','Homo_sapiens','Pan_troglodys','Canis_lupus','Rattus_rattus','Homo_erectus']
需要参照Ordered_list中的元素顺序,对上述三个列表重新排序,最终得到:
List1=['Cattus_catus','Bombyx','Mus_musculus','Canis_lupus','Rattus_rattus'] List2=['Homo_sapiens','Pan_troglodys','Homo_erectus'] List3=['Cattus_cattus','Bombyx','Mus_musculus','Homo_erectus']
实现方法
核心思路是利用参考列表的索引作为排序依据,具体步骤如下:
创建元素-索引映射字典
把Ordered_list中的每个元素和它对应的索引位置绑定,快速查找任意元素的排序优先级:Ordered_list = ['Cattus_cattus','Bombyx','Mus_musculus','Homo_sapiens','Pan_troglodys','Canis_lupus','Rattus_rattus','Homo_erectus'] order_map = {item: idx for idx, item in enumerate(Ordered_list)}对目标列表排序
使用sorted()函数,以order_map中对应的索引作为排序key。对于参考列表中不存在的元素(比如List1里的Cattus_catus),设置默认值-1让它排在最前面:处理List1:
List1 = ['Canis_lupus','Cattus_catus','Mus_musculus','Rattus_rattus','Bombyx'] sorted_list1 = sorted(List1, key=lambda x: order_map.get(x, -1)) # 结果:['Cattus_catus','Bombyx','Mus_musculus','Canis_lupus','Rattus_rattus']处理List2:
List2 = ['Homo_sapiens','Homo_erectus','Pan_troglodys'] sorted_list2 = sorted(List2, key=lambda x: order_map.get(x, -1)) # 结果:['Homo_sapiens','Pan_troglodys','Homo_erectus']处理List3:
List3 = ['Cattus_cattus','Bombyx','Homo_erectus','Mus_musculus'] sorted_list3 = sorted(List3, key=lambda x: order_map.get(x, -1)) # 结果:['Cattus_cattus','Bombyx','Mus_musculus','Homo_erectus']
说明
- 字典查找时间复杂度为O(1),排序时间复杂度为O(n log n),整体效率较高,适合处理大列表。
- 若希望参考列表外的元素排在末尾,只需把
order_map.get(x, -1)中的默认值改为float('inf')即可。
内容的提问来源于stack exchange,提问作者chippycentra
相关产品推荐
相关产品推荐

