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

如何合并列表中ID相同的元组元素?

合并相同ID元组的最简实现方法

方法一:使用字典分组(无需预先排序,通用型)

这是最直观且无需依赖额外库的实现方式,不管原列表中ID的分布是否连续都能正确处理:

lst = [(1,'X1', 256),(1,'X2', 356),(2,'X3', 223)]
result_dict = {}

# 遍历原列表,按ID分组存储数据
for id_val, label, num in lst:
    if id_val not in result_dict:
        result_dict[id_val] = [[label], [num]]
    else:
        result_dict[id_val][0].append(label)
        result_dict[id_val][1].append(num)

# 转换为目标格式
final_lst = []
for id_val, (labels, nums) in result_dict.items():
    # 单个元素保持原值,多个元素转为元组
    final_label = tuple(labels) if len(labels) > 1 else labels[0]
    final_num = tuple(nums) if len(nums) > 1 else nums[0]
    final_lst.append((id_val, final_label, final_num))

print(final_lst)
# 输出:[(1, ('X1', 'X2'), (256, 356)), (2, 'X3', 223)]

方法二:使用itertools.groupby(需预先排序)

如果原列表已经按ID连续排列,或者可以接受先排序,也可以用标准库的groupby:

from itertools import groupby

lst = [(1,'X1', 256),(1,'X2', 356),(2,'X3', 223)]
# 必须先按ID排序,否则groupby无法正确分组非连续的相同ID
sorted_lst = sorted(lst, key=lambda x: x[0])
final_lst = []

for id_val, group in groupby(sorted_lst, key=lambda x: x[0]):
    labels, nums = [], []
    for item in group:
        labels.append(item[1])
        nums.append(item[2])
    # 处理格式
    final_label = tuple(labels) if len(labels) > 1 else labels[0]
    final_num = tuple(nums) if len(nums) > 1 else nums[0]
    final_lst.append((id_val, final_label, final_num))

print(final_lst)
# 输出同样符合要求

两种方法中,字典分组的方式更通用,不需要修改原列表的顺序;如果原列表本身已经是按ID连续排列的,groupby的写法会更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:40:29