如何在Python中按路径前缀分组列表并遍历处理各组?
路径列表按前缀分组并批量处理方案
问题场景
现有路径列表,需要将所有以第一个/前的字符串为相同前缀的路径归为一组,并且对每组路径执行自定义检查操作。示例列表:
list1 = [ "glibc-2.11.3/include/sys/file.h", "glibc-2.11.3/include/sys/ioctl.h", "glibc-2.11.3/lib/crtn.o", "linux-libc-headers-2.6.32/asm-generic/bitsperlong.h", "linux-libc-headers-2.6.32/asm-generic/bitsperlong.h", "test-3.7.10/asm/posix_types.h", "test-3.7.10/dsm/posix_types.h" ]
当前仅能提取第一组前缀的路径,无法遍历处理所有分组,需要实现全部分组及后续检查操作。
解决方案
方法1:普通字典手动分组
手动遍历列表,用字典的键存储前缀,对应值存储该前缀下的所有路径:
list1 = [ "glibc-2.11.3/include/sys/file.h", "glibc-2.11.3/include/sys/ioctl.h", "glibc-2.11.3/lib/crtn.o", "linux-libc-headers-2.6.32/asm-generic/bitsperlong.h", "linux-libc-headers-2.6.32/asm-generic/bitsperlong.h", "test-3.7.10/asm/posix_types.h", "test-3.7.10/dsm/posix_types.h" ] grouped_paths = {} for path in list1: # 提取第一个/前的前缀 prefix = path.split("/")[0] # 前缀不存在则初始化空列表 if prefix not in grouped_paths: grouped_paths[prefix] = [] grouped_paths[prefix].append(path) # 遍历分组执行检查操作 for prefix, paths in grouped_paths.items(): print(f"=== 处理前缀 {prefix} ===") # 示例检查:统计路径数量+去重 print(f"路径总数:{len(paths)}") unique_paths = list(set(paths)) print(f"去重后路径:{unique_paths}") # 可替换为自定义检查逻辑,比如文件存在性验证、格式校验等
方法2:用collections.defaultdict简化分组
借助标准库的defaultdict省去前缀存在性判断,代码更简洁:
from collections import defaultdict list1 = [ "glibc-2.11.3/include/sys/file.h", "glibc-2.11.3/include/sys/ioctl.h", "glibc-2.11.3/lib/crtn.o", "linux-libc-headers-2.6.32/asm-generic/bitsperlong.h", "linux-libc-headers-2.6.32/asm-generic/bitsperlong.h", "test-3.7.10/asm/posix_types.h", "test-3.7.10/dsm/posix_types.h" ] # 初始化默认值为列表的字典 grouped_paths = defaultdict(list) for path in list1: prefix = path.split("/")[0] grouped_paths[prefix].append(path) # 执行检查操作 for prefix, paths in grouped_paths.items(): print(f"=== 处理前缀 {prefix} ===") print(f"路径列表:{paths}") # 示例检查:判断是否有重复路径 has_duplicates = len(paths) != len(set(paths)) print(f"存在重复路径:{has_duplicates}")
补充说明
- 若路径中可能存在无
/的情况,可修改前缀提取逻辑:prefix = path.split("/")[0] if "/" in path else path,避免索引错误。 - 分组后的循环可自由添加自定义检查逻辑,适配不同业务需求。
内容的提问来源于stack exchange,提问作者Kiran
相关产品推荐
相关产品推荐

