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

如何用Python的itertools生成无重复排列并合并同Filter表格记录?

问题描述

输入表格(原始数据):

LocIDfilterP1
AABC1GHY55.6
ADFT1FGH67.8
BHJH5GHY67
CHKLBHY78
BGTYFGH60

期望输出表格(按相同Filter合并记录):

FilterIDLocP1m_IDm_Locm_p1total
GHYABC1A55.6HJH5B67122.6
FGHDFT1A67.8GTYB60127.8

请问是否可以使用Python的itertools库生成无重复排列来实现该需求?若可行,请给出具体的实现思路与方法。


实现方案

可以用itertools实现,核心是先通过groupby按Filter分组,再对组内记录进行配对处理,具体思路和代码如下:

实现思路

  1. 数据预处理:将原始数据转为字典列表格式,同时把P1转为数值类型,方便后续计算总和。
  2. 按Filter分组:先对数据按filter字段排序(groupby要求数据先排序才能正确分组),再用itertools.groupby完成分组,得到每个Filter对应的所有记录。
  3. 组内记录配对:针对每组内的记录,若数量为2条直接拆分为主记录和匹配记录;若数量多于2条,可使用itertools.permutations生成无重复的两两排列来完成配对(示例仅处理每组2条的情况)。
  4. 构造输出行:将配对后的记录合并成目标格式的行,计算total值,收集所有符合要求的结果。
  5. 输出结果:将结果转换为表格格式输出。

代码实现

import itertools

# 原始数据
raw_data = [
    {"Loc": "A", "ID": "ABC1", "filter": "GHY", "P1": 55.6},
    {"Loc": "A", "ID": "DFT1", "filter": "FGH", "P1": 67.8},
    {"Loc": "B", "ID": "HJH5", "filter": "GHY", "P1": 67},
    {"Loc": "C", "ID": "HKL", "filter": "BHY", "P1": 78},
    {"Loc": "B", "ID": "GTY", "filter": "FGH", "P1": 60}
]

# 1. 按filter排序,确保groupby能正确分组
sorted_data = sorted(raw_data, key=lambda x: x["filter"])

# 2. 按filter分组
grouped_data = itertools.groupby(sorted_data, key=lambda x: x["filter"])

output_rows = []
for filter_val, records in grouped_data:
    record_list = list(records)
    # 处理每组恰好2条记录的情况(匹配示例需求)
    if len(record_list) == 2:
        rec1, rec2 = record_list
        total = rec1["P1"] + rec2["P1"]
        output_rows.append({
            "Filter": filter_val,
            "ID": rec1["ID"],
            "Loc": rec1["Loc"],
            "P1": rec1["P1"],
            "m_ID": rec2["ID"],
            "m_Loc": rec2["Loc"],
            "m_p1": rec2["P1"],
            "total": total
        })
    # 若每组记录数大于2,可取消下面注释用permutations生成无重复配对
    # elif len(record_list) > 2:
    #     for pair in itertools.permutations(record_list, 2):
    #         rec1, rec2 = pair
    #         # 按相同逻辑构造输出行

# 打印Markdown格式的结果表格
print("| Filter | ID    | Loc | P1   | m_ID  | m_Loc | m_p1 | total  |")
print("|--------|-------|-----|------|-------|-------|------|--------|")
for row in output_rows:
    print(f"| {row['Filter']} | {row['ID']} | {row['Loc']} | {row['P1']} | {row['m_ID']} | {row['m_Loc']} | {row['m_p1']} | {row['total']} |")

代码说明

  • itertools.groupby是核心分组工具,必须先对数据按分组键排序,否则会出现分组不完整的情况。
  • 示例中仅处理每组2条记录的场景,若需要处理更多记录的分组,可启用itertools.permutations生成所有无重复的两两组合,按需扩展逻辑。
  • 最终计算的total是两条记录P1字段的数值和,完全匹配示例需求。

内容的提问来源于stack exchange,提问作者Sai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:18:38