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

如何合并嵌套列表元素:对前缀相同的子项第三元素求和

优雅实现嵌套列表按前两元素分组求和

需求:给定嵌套列表,将前两个元素相同的子列表合并,对第三个元素求和。示例:

before = [['a','a', 1],['a','a', 2], ['a','b', 6], ['a','b', 0], ['a','c',5]]
# 处理后
after = [['a','a', 3], ['a','b', 6], ['a','c',5]]

方法一:使用字典(高效且保留插入顺序)

利用字典的键唯一性存储分组,一次遍历完成求和,时间复杂度O(n),Python 3.7+的字典会保留分组的首次出现顺序:

before = [['a','a', 1],['a','a', 2], ['a','b', 6], ['a','b', 0], ['a','c',5]]

sum_dict = {}
for item in before:
    key = (item[0], item[1])
    sum_dict[key] = sum_dict.get(key, 0) + item[2]

# 转换为目标列表格式
after = [[k[0], k[1], v] for k, v in sum_dict.items()]
print(after)

方法二:使用itertools.groupby

需要先对列表按分组键排序(groupby仅合并连续的相同键元素),适合允许排序的场景:

from itertools import groupby

before = [['a','a', 1],['a','a', 2], ['a','b', 6], ['a','b', 0], ['a','c',5]]

# 先按前两个元素排序,确保同组元素连续
sorted_list = sorted(before, key=lambda x: (x[0], x[1]))

after = []
for key, group in groupby(sorted_list, key=lambda x: (x[0], x[1])):
    total = sum(item[2] for item in group)
    after.append([key[0], key[1], total])

print(after)

对比原实现

原方案通过两层循环遍历,时间复杂度为O(n²),当列表规模较大时效率较低。上述两种方法均只需单次遍历(或排序+单次遍历),代码更简洁且性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:27:21