如何从字典列表中筛选指定扩展名且处于最浅层级的文件路径
问题描述
给定如下字典列表:
data = [{'name': 'root/folder1/asd/file.csv'}, {'name': 'root/folder1/bsd/file.csv'}, {'name': 'root/folder1/folder2/folder3/new.csv'}, {'name': 'root/folder1/folder2/folder3'}]
需要从中筛选出仅包含特定扩展名(.exe或.csv),且位于列表中最浅层级的文件。规则是:找到所有符合扩展名要求的路径中斜杠数量的最小值,只保留斜杠数等于该最小值的路径。
初始实现代码如下:
for path in data: if path.get('name').endswith('.exe') or path.endswith('.csv'): path_count = len(re.findall('/', path)) path.update({'path_count': path_count})
希望得到更简洁的实现方式。
简洁实现方案
可以通过两步完成,无需多次循环,且用更高效的字符串方法替代正则统计斜杠数:
# 定义目标扩展名 target_extensions = ('.exe', '.csv') # 第一步:筛选符合扩展名的路径,同时计算每个路径的斜杠数量 valid_paths = [ (item['name'], item['name'].count('/')) for item in data if item['name'].endswith(target_extensions) ] # 第二步:找到最小斜杠数,筛选出对应路径 if valid_paths: min_slash_count = min(cnt for _, cnt in valid_paths) result = [path for path, cnt in valid_paths if cnt == min_slash_count] else: result = [] print(result)
说明
- 用
str.count('/')替代正则re.findall统计斜杠数,代码更简洁且执行效率更高。 - 列表推导式一步完成筛选和计数,避免修改原字典结构。
- 通过生成器表达式快速定位最小斜杠数,再筛选出符合条件的路径,逻辑清晰且代码紧凑。
运行上述代码,输出结果为:
['root/folder1/asd/file.csv', 'root/folder1/bsd/file.csv']
内容的提问来源于stack exchange,提问作者newbiee
相关产品推荐
相关产品推荐

