如何按相似性对Zip文件路径字符串列表进行分组?
按相似性分组Zip文件路径的实现方案
你需要对Zip文件路径列表按相似性分组,简化示例路径如下:
zip_paths = [ "path/002_AC_HELICOPTEROS-MARINOS_20230329_210358_145T3_21049_00748_DMAU.zip", "path/002_AC_NOLAS_20230326_234440_145T2_20160_06473_VMS_UMS.zip", "path/002_AC_HELICOPTEROS-MARINOS_20230329_211105_145T3_21049_00748_FDCR.zip", "path/002_AC_HELICOPTEROS-MARINOS_20230329_205916_145T3_21049_00747_VMS_UMS.zip", "path/002_AC_NOLAS_20230326_235504_145T2_20160_06473_FDCR.zip" ]
期望分组结果:
[ [ "path/002_AC_HELICOPTEROS-MARINOS_20230329_210358_145T3_21049_00748_DMAU.zip", "path/002_AC_HELICOPTEROS-MARINOS_20230329_211105_145T3_21049_00748_FDCR.zip" ], [ "path/002_AC_HELICOPTEROS-MARINOS_20230329_205916_145T3_21049_00747_VMS_UMS.zip" ], [ "path/002_AC_NOLAS_20230326_234440_145T2_20160_06473_VMS_UMS.zip", "path/002_AC_NOLAS_20230326_235504_145T2_20160_06473_FDCR.zip" ] ]
分组规则分析
从你给出的分组通配符可以看出,分组的核心是提取路径中固定不变的关键段:
- 机构名称(如
HELICOPTEROS-MARINOS、NOLAS) - 日期(如
20230329、20230326) - 末尾的两个编号段(如
21049_00748、20160_06473)
中间的时间戳(如210358)和最后的文件类型后缀(如DMAU)不影响分组。
Python实现方案
可以用itertools.groupby来实现,步骤如下:
- 先对路径列表排序(
groupby要求同组元素连续) - 定义分组键的lambda函数,提取关键段作为分组依据
完整代码:
from itertools import groupby zip_paths = [ "path/002_AC_HELICOPTEROS-MARINOS_20230329_210358_145T3_21049_00748_DMAU.zip", "path/002_AC_NOLAS_20230326_234440_145T2_20160_06473_VMS_UMS.zip", "path/002_AC_HELICOPTEROS-MARINOS_20230329_211105_145T3_21049_00748_FDCR.zip", "path/002_AC_HELICOPTEROS-MARINOS_20230329_205916_145T3_21049_00747_VMS_UMS.zip", "path/002_AC_NOLAS_20230326_235504_145T2_20160_06473_FDCR.zip" ] # 排序确保同组元素连续 sorted_paths = sorted(zip_paths) # 定义分组键:拆分路径为下划线分隔的段,提取关键部分 group_key = lambda path: ( path.split('_')[3], # 提取机构名称 path.split('_')[4], # 提取日期 path.split('_')[-3], # 提取倒数第三个编号段 path.split('_')[-2] # 提取倒数第二个编号段 ) # 执行分组,转换为列表格式 grouped_result = [list(group) for _, group in groupby(sorted_paths, key=group_key)] # 输出结果 print(grouped_result)
代码说明
path.split('_'):把路径按下划线拆分为列表,以第一个路径为例,拆分后为:['path/002', 'AC', 'HELICOPTEROS-MARINOS', '20230329', '210358', '145T3', '21049', '00748', 'DMAU.zip']- 分组键提取的是固定不变的核心字段,只要这些字段相同的路径就会被分到同一组。
groupby依赖排序后的列表,因此先执行sorted(zip_paths)保证同组元素连续排列。
内容的提问来源于stack exchange,提问作者FrozzenFinger
相关产品推荐
相关产品推荐

