如何用Python的itertools生成无重复排列并合并同Filter表格记录?
问题描述
输入表格(原始数据):
| Loc | ID | filter | P1 |
|---|---|---|---|
| A | ABC1 | GHY | 55.6 |
| A | DFT1 | FGH | 67.8 |
| B | HJH5 | GHY | 67 |
| C | HKL | BHY | 78 |
| B | GTY | FGH | 60 |
期望输出表格(按相同Filter合并记录):
| Filter | ID | Loc | P1 | m_ID | m_Loc | m_p1 | total |
|---|---|---|---|---|---|---|---|
| GHY | ABC1 | A | 55.6 | HJH5 | B | 67 | 122.6 |
| FGH | DFT1 | A | 67.8 | GTY | B | 60 | 127.8 |
请问是否可以使用Python的itertools库生成无重复排列来实现该需求?若可行,请给出具体的实现思路与方法。
实现方案
可以用itertools实现,核心是先通过groupby按Filter分组,再对组内记录进行配对处理,具体思路和代码如下:
实现思路
- 数据预处理:将原始数据转为字典列表格式,同时把
P1转为数值类型,方便后续计算总和。 - 按Filter分组:先对数据按
filter字段排序(groupby要求数据先排序才能正确分组),再用itertools.groupby完成分组,得到每个Filter对应的所有记录。 - 组内记录配对:针对每组内的记录,若数量为2条直接拆分为主记录和匹配记录;若数量多于2条,可使用
itertools.permutations生成无重复的两两排列来完成配对(示例仅处理每组2条的情况)。 - 构造输出行:将配对后的记录合并成目标格式的行,计算
total值,收集所有符合要求的结果。 - 输出结果:将结果转换为表格格式输出。
代码实现
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
相关产品推荐
相关产品推荐

