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

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])
]
解决方案

思路

  1. 扁平化处理:遍历原列表,拆分所有包含多元素的元组,得到仅含单个元素的元组列表
  2. 分组求和:使用字典按前三元素分组,累加每组对应的最后一项数值
  3. 格式转换:将分组结果转换为要求的元组格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:50:32