如何在Python中对列表的列表分组并聚合用户数据?
按用户分组累加time、cpus、mem数值的解决方案
我明白你要做的是按用户分组,把每个用户对应的time、cpus、mem数值分别累加,对吧?这其实用Python的字典就能轻松搞定,我给你两种实现方式,你可以按需选择:
方法一:基础字典实现
适合不想引入额外模块的场景,逻辑清晰直观:
# 示例输入数据(替换成你的真实数据) data = [ ['user1', 10, 2, 4], ['user1', 20, 3, 5], ['user2', 15, 1, 3], ['user3', 5, 4, 2], ['user2', 5, 2, 1] ] # 初始化字典存储每个用户的累计值 user_totals = {} # 遍历每条数据 for entry in data: username, time, cpus, mem = entry # 如果用户已在字典中,就累加对应数值 if username in user_totals: user_totals[username][0] += time user_totals[username][1] += cpus user_totals[username][2] += mem # 如果是新用户,初始化累计值 else: user_totals[username] = [time, cpus, mem] # 转换成你需要的列表格式:[用户名, 总时间, 总cpus, 总mem] result = [[user] + totals for user, totals in user_totals.items()] print(result)
运行后输出:
[['user1', 30, 5, 9], ['user2', 20, 3, 4], ['user3', 5, 4, 2]]
方法二:使用collections.defaultdict简化代码
如果想让代码更简洁,可以用Python标准库的defaultdict,它会自动为新用户初始化默认的累加起始值:
from collections import defaultdict # 示例输入数据 data = [ ['user1', 10, 2, 4], ['user1', 20, 3, 5], ['user2', 15, 1, 3], ['user3', 5, 4, 2], ['user2', 5, 2, 1] ] # 初始化defaultdict,默认值为[0, 0, 0](对应time、cpus、mem的初始累加值) user_totals = defaultdict(lambda: [0, 0, 0]) for entry in data: username, time, cpus, mem = entry # 直接累加,不用判断用户是否存在 user_totals[username][0] += time user_totals[username][1] += cpus user_totals[username][2] += mem # 转换成目标列表格式 result = [[user] + totals for user, totals in user_totals.items()] print(result)
两种方法最终的效果是一样的,你可以根据自己的代码习惯选择。
内容的提问来源于stack exchange,提问作者Jamal 'kRUSER' Benson
相关产品推荐
相关产品推荐

