如何基于子字符串对文件名列表排序,优化大文件处理效率
高效实现文件名分组排序的方案
你原来的代码效率低的核心原因是嵌套循环带来的O(n²)时间复杂度,每处理一个文件名都要遍历全列表匹配前缀,数据量大的时候开销会指数级上升。下面是两种高效实现方式,时间复杂度均为O(n log n),适合处理大体积文件:
方案1:直接自定义排序键(代码最简)
直接利用Python内置的sorted函数,指定排序规则为-分割后的第一部分前缀即可:
# lines 为读取到的所有文件名组成的列表 final_list = sorted(lines, key=lambda x: x.split("-")[0])
如果需要同前缀的文件也按后缀规则排序,可以把键改为元组,比如同前缀下按第二个片段排序:
final_list = sorted(lines, key=lambda x: (x.split("-")[0], x.split("-")[1]))
方案2:字典分组后合并(适合需要单独处理分组的场景)
如果后续需要对每个分组单独操作,可以先用字典做O(n)复杂度的分组,再排序前缀后合并结果:
from collections import defaultdict group_map = defaultdict(list) for file_name in lines: prefix = file_name.split("-")[0] group_map[prefix].append(file_name) final_list = [] # 按前缀排序后依次合并分组内容 for prefix in sorted(group_map.keys()): # 同组内容需要排序的话可以改成 sorted(group_map[prefix]) final_list.extend(group_map[prefix])
两种方案处理百万级别的文件名也能在秒级完成,远优于原写法的性能。
内容的提问来源于stack exchange,提问作者Joey Joestar
相关产品推荐
相关产品推荐

