Python实现嵌套列表中第n个元素相同时对应值求和
Python实现嵌套列表按指定元素分组求和
我来帮你搞定这个分组求和的需求!首先咱们明确一下目标:针对给定的嵌套列表my_list1,要按照子列表的第0个元素(姓名)进行分组,把每组内子列表的数值型元素(也就是索引1和3的元素)分别求和,最终得到每个姓名对应的汇总结果。
先把咱们要处理的列表贴出来,方便对照:
my_list1 = [ ['John',2,'goals',4], ['Robert',5,'hike',3], ['Julia',6,'paid',2], ['John',4,'fine',6], ['Robert',3,'loop',44], ['Julia',1,'cool',33], ['Kris',6,'wild',4], ['Kris',8,'word',67] ]
下面给你三种实用的实现方式:
方法1:普通字典手动累加(新手友好,逻辑清晰)
这种方法最容易理解,通过遍历列表,用字典存储每个姓名对应的数值总和,不存在的姓名就初始化,存在的就累加:
# 初始化空字典存储结果 result = {} for item in my_list1: name = item[0] num1 = item[1] num2 = item[3] # 如果姓名不在字典里,初始化两个数值的和 if name not in result: result[name] = [num1, num2] # 否则直接累加对应数值 else: result[name][0] += num1 result[name][1] += num2 # 转换成和原列表类似的嵌套列表格式(可选) final_list = [[k] + v for k, v in result.items()] print(final_list)
运行后输出:
[['John', 6, 10], ['Robert', 8, 47], ['Julia', 7, 35], ['Kris', 14, 71]]
方法2:用collections.defaultdict(更简洁高效)
defaultdict可以帮我们自动初始化键对应的默认值,省去判断键是否存在的步骤,代码更简洁:
from collections import defaultdict # 初始化每个键对应的默认值为[0, 0],分别对应两个数值的总和 result = defaultdict(lambda: [0, 0]) for item in my_list1: name = item[0] result[name][0] += item[1] result[name][1] += item[3] # 转换成嵌套列表格式(可选) final_list = [[k] + v for k, v in result.items()] print(final_list)
这个方法的输出和上面完全一致,代码量更少,适合熟悉Python标准库的同学。
方法3:用itertools.groupby(适合已排序的场景)
groupby可以直接按指定键分组,但要注意它只会对连续相同的元素分组,所以我们需要先把列表按姓名排序:
from itertools import groupby # 先按姓名对列表排序 sorted_list = sorted(my_list1, key=lambda x: x[0]) result = [] # 按姓名分组,遍历每个组 for name, group in groupby(sorted_list, key=lambda x: x[0]): total_num1 = 0 total_num2 = 0 # 累加当前组内的所有数值 for item in group: total_num1 += item[1] total_num2 += item[3] # 把结果添加到列表中 result.append([name, total_num1, total_num2]) print(result)
这种方法适合已经有排序需求的场景,或者需要对分组后的元素做更多操作的情况。
内容的提问来源于stack exchange,提问作者GRNearth
相关产品推荐
相关产品推荐

