You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按相似性对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来实现,步骤如下:

  1. 先对路径列表排序(groupby要求同组元素连续)
  2. 定义分组键的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:02:49