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

Python:如何合并字典列表中sets值≤2的同类别字典并清理原条目

问题描述

给定如下训练数据集:

[
  {'sets': 3, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 3, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 4, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 2, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 3, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 2, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 3, 'muscle': 'Abdominal', 'body_part': 'Abdominal'}
]

需要实现的逻辑是:合并两个sets值≤2的同类别字典(类别由muscle和body_part共同决定),合并后新条目的sets为两者之和,其余字段保持不变,同时移除原来的两个条目。期望输出如下:

[
  {'sets': 3, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 3, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 4, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 4, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 3, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 3, 'muscle': 'Abdominal', 'body_part': 'Abdominal'}
]

用户已尝试以下代码筛选出待处理条目,但尚未完成合并与清理:

replaces = {}

for part in data:
    if part['sets'] == 2:
        if part['muscle'] not in replaces:
            replaces[part['muscle']] = []
            
        replaces[part['muscle']].append({
            'sets': part['sets'],
            'muscle': part['muscle'],
            'body_part': part['body_part']
        })
解决方案

可以通过分组收集待合并条目、重新构建结果列表的方式完成操作,具体实现代码如下:

data = [
  {'sets': 3, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 3, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 4, 'muscle': 'Chest', 'body_part': 'Upper'},
  {'sets': 2, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 3, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 2, 'muscle': 'Abdominal', 'body_part': 'Abdominal'},
  {'sets': 3, 'muscle': 'Abdominal', 'body_part': 'Abdominal'}
]

# 以(muscle, body_part)为键,分组存储所有sets≤2的条目
merge_candidates = {}
for item in data:
    if item['sets'] <= 2:
        key = (item['muscle'], item['body_part'])
        merge_candidates.setdefault(key, []).append(item)

result = []
for item in data:
    key = (item['muscle'], item['body_part'])
    # 若当前条目是待合并项,且该组至少有2个待合并条目
    if item['sets'] <= 2 and len(merge_candidates[key]) >= 2:
        # 取出两个条目合并后加入结果
        first = merge_candidates[key].pop(0)
        second = merge_candidates[key].pop(0)
        merged_item = {
            'sets': first['sets'] + second['sets'],
            'muscle': first['muscle'],
            'body_part': first['body_part']
        }
        result.append(merged_item)
    elif item['sets'] > 2:
        # 无需合并的条目直接加入结果
        result.append(item)
    else:
        # 若分组剩余单个待合并条目,直接保留(可按需调整逻辑)
        result.append(item)

# 输出最终结果
print(result)

代码说明

  • 先用merge_candidates按类别分组存储所有符合合并条件的条目,确保只有muscle和body_part完全匹配的条目才会被合并;
  • 遍历原始数据时,遇到待合并条目且分组内数量足够,就取出两个合并成新条目加入结果,同时跳过后续对应原始条目;
  • 对于sets>2的条目直接保留,不做修改;
  • 若分组中剩余单个sets≤2的条目,代码默认保留,可根据需求调整为丢弃或其他逻辑。

内容的提问来源于stack exchange,提问作者E. Zeytinci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:35:27