Python中如何按另一列表的自定义顺序对字符串列表排序
实现方法与原理解释
1 核心实现代码
你可以直接通过Python内置list.sort()的key参数实现需求,代码如下:
example_list = ['h1','ee1','hi1','ol1','b1','ol1','b1'] order_list = ['ee','hi','h','b','ol'] # 构建优先级映射字典 order_priority = {prefix: index for index, prefix in enumerate(order_list)} # 按指定规则排序 example_list.sort(key=lambda item: order_priority[item[:-1]]) print(example_list) # 输出结果:['ee1', 'hi1', 'h1', 'b1', 'b1', 'ol1', 'ol1']
如果你想要实现你提到的example_list.sort(use_order_of=order_list)调用格式,可以扩展内置list的方法:
# 扩展自定义排序方法 def order_sort(self, use_order_of): order_priority = {prefix: index for index, prefix in enumerate(use_order_of)} self.sort(key=lambda item: order_priority[item[:-1]]) list.order_sort = order_sort # 调用方式完全符合你的预期 example_list.order_sort(use_order_of=order_list)
2 原理解释
- 首先构建
order_priority字典:将order_list里的前缀和它的下标做映射,下标越小代表排序优先级越高,字典的查询效率是O(1),比直接用list.index()查找的O(n)效率高很多,数据量越大优势越明显。 - 排序时传入的
key函数会对每个元素做处理:因为所有元素末尾字符一致,我们用item[:-1]切掉每个元素的最后一位得到前缀,再查前缀对应的优先级序号,sort方法会默认按序号从小到大排序,最终得到你需要的结果。
3 兼容处理
如果你的列表里存在不在order_list里的前缀,不想触发KeyError的话,可以修改key函数的取值逻辑,把未知前缀统一排在最后:
example_list.sort(key=lambda item: order_priority.get(item[:-1], len(order_list)))
内容的提问来源于stack exchange,提问作者Deera Wijesundara
相关产品推荐
相关产品推荐

