如何按指定规则对含数字和时间单位的字符串列表实现最优排序
Python 时间字符串排序最佳实践
核心实现方案
你可以直接利用Python内置的sorted函数自定义排序key实现需求,无需手动拆分列表再拼接,代码简洁且性能更优:
my_list = ['1h-data', '1m-data', '15m-data' , '4h-data', '50s-data'] # 定义单位优先级映射,权重越小排序越靠前 unit_priority = {'s': 1, 'm': 2, 'h': 3} def sort_key(item): time_part = item.split('-')[0] # 提取数字和单位 num = int(time_part[:-1]) unit = time_part[-1] # 按「单位优先级→数字大小」的顺序返回排序元组 return (unit_priority[unit], num) # 生成排序后的新列表 my_ordered_list = sorted(my_list, key=sort_key) # 如果不需要保留原列表,可直接原地排序更省内存 # my_list.sort(key=sort_key) print(my_ordered_list) # 输出结果:['50s-data', '1m-data', '15m-data', '1h-data', '4h-data']
方案优势
- 逻辑简洁:直接复用Python内置的元组排序规则,无需手动拆分、排序、拼接列表,易维护
- 性能更优:单位优先级用字典映射,查询效率为O(1),对比原本用列表
index()查找优先级的O(n)效率,数据量越大优势越明显 - 扩展性强:后续需要新增时间单位(比如
d代表天)时,只需要在unit_priority中新增对应键值对即可,无需修改排序逻辑
精简写法(一次性场景)
如果是单次排序不需要复用排序逻辑,可以直接用lambda表达式简化代码:
unit_priority = {'s': 1, 'm': 2, 'h': 3} my_ordered_list = sorted(my_list, key=lambda x: (unit_priority[x.split('-')[0][-1]], int(x.split('-')[0][:-1])))
内容的提问来源于stack exchange,提问作者Mahjube Tasdighi
相关产品推荐
相关产品推荐

