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
相关产品推荐
相关产品推荐

