如何合并列表中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
相关产品推荐
相关产品推荐

