Python实现列表前三元素相同时对应最后元素求和
问题描述
我们需要处理一个包含特定结构元组的列表,规则如下:
- 当元组的前三元素(
item[0]、item[1]、item[2])完全相同时,将这些元组的最后一项(item[3])中的数值求和,最终输出格式为([x], [y], [z], [求和结果]) - 特殊处理:若元组的前三元素是包含多个元素的列表(例如
([2792, 2810], ['C', 'C'], ['T', 'T'], [40, 40])),需先拆分为多个独立元组,每个元组对应原列表同位置的单个元素,即拆分为([2792], ['C'], ['T'], [40])和([2810], ['C'], ['T'], [40])
待处理列表:
original_list = [ ([2792], ['C'], ['T'], [39]), ([2810], ['C'], ['T'], [40]), ([586], ['G'], ['A'], [40]), ([586], ['G'], ['A'], [40]), ([832], ['G'], ['A'], [40]), ([2810], ['C'], ['T'], [40]), ([2792, 2810], ['C', 'C'], ['T', 'T'], [40, 40]), ([2730], ['A'], ['G'], [40]), ([4623, 4624], ['A', 'T'], ['G', 'C'], [29, 12]), ([2810], ['C'], ['T'], [40]), ([4687], ['T'], ['G'], [22]), ([2730], ['A'], ['G'], [40]), ([3493], ['G'], ['T'], [40]), ([2730], ['A'], ['G'], [40]), ([2810], ['C'], ['T'], [40]), ([832], ['G'], ['A'], [40]), ([444, 471], ['A', 'A'], ['T', 'T'], [10, 15]), ([2730], ['A'], ['G'], [40]), ([784], ['T'], ['A'], [27]), ([2730], ['A'], ['G'], [40]), ([2730], ['A'], ['G'], [40]), ([2792, 2810], ['C', 'C'], ['T', 'T'], [40, 40]), ([5373], ['T'], ['C'], [31]), ([3131], ['G'], ['A'], [40]), ([2730], ['A'], ['G'], [40]), ([2810], ['C'], ['T'], [40]), ([2792, 2810], ['C', 'C'], ['T', 'T'], [40, 40]), ([586], ['G'], ['A'], [40]), ([3578], ['A'], ['T'], [40]), ([2810], ['C'], ['T'], [40]), ([2730], ['A'], ['G'], [39]), ([832], ['G'], ['A'], [40]), ([2810], ['C'], ['T'], [40]), ([832], ['G'], ['A'], [38]), ([4248], ['T'], ['A'], [33]), ([832], ['G'], ['A'], [39]), ([2792], ['C'], ['T'], [40]), ([586], ['G'], ['A'], [40]), ([832], ['G'], ['A'], [40]), ([2730], ['A'], ['G'], [40]), ([2730], ['A'], ['G'], [40]), ([2730], ['A'], ['G'], [38]), ([2810], ['C'], ['T'], [40]), ([832], ['G'], ['A'], [40]), ([2730], ['A'], ['G'], [37]), ([4146, 4173], ['A', 'T'], ['T', 'G'], [33, 9]), ([99, 103], ['A', 'A'], ['C', 'C'], [24, 28]), ([99, 108], ['A', 'A'], ['C', 'C'], [19, 28]), ([882], ['T'], ['A'], [40]), ([2663], ['T'], ['A'], [23]), ([832], ['G'], ['A'], [40]), ([2792], ['C'], ['T'], [40]) ]
解决方案
思路
- 扁平化处理:遍历原列表,拆分所有包含多元素的元组,得到仅含单个元素的元组列表
- 分组求和:使用字典按前三元素分组,累加每组对应的最后一项数值
- 格式转换:将分组结果转换为要求的元组格式
Python 实现代码
# 第一步:扁平化处理所有元组 flattened = [] for tup in original_list: # 获取每个位置的元素长度,确保覆盖所有多元素情况 length = max(len(tup[0]), len(tup[1]), len(tup[2]), len(tup[3])) for i in range(length): new_tup = ( [tup[0][i]], [tup[1][i]], [tup[2][i]], [tup[3][i]] ) flattened.append(new_tup) # 第二步:分组求和 sum_dict = {} for tup in flattened: # 将前三元素转成元组作为字典键(列表不可哈希) key = (tuple(tup[0]), tuple(tup[1]), tuple(tup[2])) # 提取数值并累加 value = tup[3][0] sum_dict[key] = sum_dict.get(key, 0) + value # 第三步:转换为要求的输出格式 result = [] for key, total in sum_dict.items(): result.append( (list(key[0]), list(key[1]), list(key[2]), [total]) ) # 输出结果 for item in result: print(item)
最终处理结果
([2792], ['C'], ['T'], [159]) ([2810], ['C'], ['T'], [400]) ([586], ['G'], ['A'], [160]) ([832], ['G'], ['A'], [317]) ([2730], ['A'], ['G'], [514]) ([4623], ['A'], ['G'], [29]) ([4624], ['T'], ['C'], [12]) ([4687], ['T'], ['G'], [22]) ([3493], ['G'], ['T'], [40]) ([444], ['A'], ['T'], [10]) ([471], ['A'], ['T'], [15]) ([784], ['T'], ['A'], [27]) ([5373], ['T'], ['C'], [31]) ([3131], ['G'], ['A'], [40]) ([3578], ['A'], ['T'], [40]) ([4248], ['T'], ['A'], [33]) ([4146], ['A'], ['T'], [33]) ([4173], ['T'], ['G'], [9]) ([99], ['A'], ['C'], [43]) ([103], ['A'], ['C'], [28]) ([108], ['A'], ['C'], [28]) ([882], ['T'], ['A'], [40]) ([2663], ['T'], ['A'], [23])
内容的提问来源于stack exchange,提问作者beepboopbeep
相关产品推荐
相关产品推荐

