如何在Python中按指定分组合并列表并保留原有顺序?
Python实现利润表项目按组合并并保留顺序
核心思路
以总毛利润、总营业利润为锚点划分三个分组:
- 锚点1(总毛利润)之前的项目 → 归为「总毛利润」组(对应汇总项总毛利润)
- 锚点1与锚点2(总营业利润)之间的项目 → 归为「总营业利润」组(对应汇总项总营业利润)
- 锚点2之后的项目 → 归为「最终利润」组
遍历各年份利润表时,按顺序处理每个项目:
- 跳过已添加的项目(去重)
- 遇到锚点时切换分组,同时将锚点本身归入对应组
- 普通项目直接归入当前分组,保留首次出现的顺序
代码实现
# 准备各年份利润表数据 profit_tables = [ ["销售收入", "服务收入", "销货成本", "总毛利润", "保险费", "薪资", "总营业利润", "税金", "净利润"], ["销售收入", "咨询收入", "销货成本", "总毛利润", "保险费", "维护费", "薪资", "总营业利润", "税金", "利息", "总净利润"] ] # 定义分组锚点 anchors = ["总毛利润", "总营业利润"] # 初始化:保存合并后的有序项目、项目-组映射 merged_ordered_items = [] item_to_group = {} for table in profit_tables: current_group = "总毛利润" # 初始分组为第一个锚点对应的组 anchor_index = 0 for item in table: # 跳过已存在的项目,保证去重且保留首次顺序 if item in item_to_group: continue # 处理锚点:切换分组并记录锚点自身的组 if anchor_index < len(anchors) and item == anchors[anchor_index]: item_to_group[item] = item merged_ordered_items.append(item) anchor_index += 1 # 更新当前分组为下一个锚点或最终利润组 current_group = anchors[anchor_index] if anchor_index < len(anchors) else "最终利润" else: # 普通项目归入当前分组 item_to_group[item] = current_group merged_ordered_items.append(item) # 按分组整理结果 grouped_result = {} for item in merged_ordered_items: group = item_to_group[item] if group not in grouped_result: grouped_result[group] = [] grouped_result[group].append(item) # 输出结果 print("合并后按组分类的利润表项目(保留首次出现顺序):") for group_name, items in grouped_result.items(): print(f"\n* {group_name} 组:") for item in items: print(f" - {item}")
运行结果
合并后按组分类的利润表项目(保留首次出现顺序): * 总毛利润 组: - 销售收入 - 服务收入 - 销货成本 - 总毛利润 - 咨询收入 * 总营业利润 组: - 保险费 - 薪资 - 总营业利润 - 维护费 * 最终利润 组: - 税金 - 净利润 - 利息 - 总净利润
关键点说明
- 用
merged_ordered_items列表严格保留项目首次出现的顺序 - 用
item_to_group字典快速判断项目是否已存在,实现去重的同时记录所属分组 - 锚点处理逻辑确保分组切换的准确性,完全匹配利润表的结构逻辑
内容的提问来源于stack exchange,提问作者JMKIT
相关产品推荐
相关产品推荐

