如何从Python已排序的带倍率图片文件名列表中提取各分组最高倍率条目
实现思路
基于题目给出的两个明确输入规则,可以做轻量化、低开销实现:
- 输入列表
a_list已完成预排序,同一分组的文件名会连续相邻排列 - 同一分组的倍率序列为无缺失的等差数列,即同组内倍率随列表顺序递增,同组的最后一个元素就是倍率最高的条目
无需遍历全量记录每个分组的最大倍率,仅需通过拆分文件名的分组前缀、判断相邻元素的分组是否切换,即可收集到所有分组的最高倍率条目。
具体实现
拆分规则
严格遵循题目定义:取文件名末尾匹配\d+x格式的部分作为倍率标识,该部分之前的所有内容作为分组判定前缀。
核心代码
import re def get_highest_res_entries(a_list): # 预编译正则:匹配格式为【任意前缀 + 末尾数字 + x】的文件名,捕获分组前缀、倍率数值 pattern = re.compile(r'^(.*?)(\d+)x$') result = [] current_group = None for idx, filename in enumerate(a_list): match = pattern.match(filename) if not match: # 按题目约定输入均为合法格式,此处可根据需要增加异常处理逻辑 continue prefix = match.group(1) # 检测到遍历进入新分组 if prefix != current_group: # 非列表起始位置时,上一个分组已遍历完成,将该组最后一个条目加入结果 if idx != 0: result.append(a_list[idx - 1]) # 更新当前追踪的分组标识 current_group = prefix # 遍历结束后,将最后一个分组的最高倍率条目加入结果 if a_list: result.append(a_list[-1]) return result
效果验证
使用题目给出的示例输入测试:
a_list = [ 'img_229_152_webp_1x', 'img_229_152_webp_2x', 'img_229_152_webp_3x', 'img_229_152_webp_4x', 'img_229_152_webp_5x', 'img_246_164_webp_1x', 'img_246_164_webp_2x', 'img_246_164_webp_3x', 'img_246_164_webp_4x' ] print(get_highest_res_entries(a_list)) # 输出结果:['img_229_152_webp_5x', 'img_246_164_webp_4x'],与预期完全一致
方案特点
- 时间复杂度为O(n),仅对列表做一次线性遍历,无需额外存储所有分组的全量条目,内存开销极低
- 拆分逻辑严格匹配题目定义的倍率识别规则,不会误将文件名中间的数字x片段判定为倍率标识
- 适配所有题目约定的合法输入场景,对空列表、单分组等边界情况也能正常处理
内容的提问来源于stack exchange,提问作者Kifsif
相关产品推荐
相关产品推荐

