Python如何不使用for循环实现字典列表按指定key累加对应数值
Python字典列表按name分组累加points的无显式for循环实现方案
首先明确:这里的「不使用for循环」指不手动编写显式for循环处理判断逻辑,所有迭代逻辑由标准库/第三方库内部封装,底层本质还是存在循环操作,只是不需要开发者手动实现。
以下是几种可行的实现方案:
方案1:基于functools.reduce的纯标准库实现
无需额外安装依赖,仅用Python内置标准库即可完成:
from functools import reduce from collections import defaultdict data = [ {'name': 'Jack', 'points': 10}, {'name': 'John', 'points': 12}, {'name': 'Jack', 'points': 15}, {'name': 'Harry', 'points': 11} ] # 累加逻辑封装在reduce中,无显式for循环 points_sum = reduce( lambda acc, item: (acc.update({item['name']: acc.get(item['name'], 0) + item['points']}) or acc), data, defaultdict(int) ) # 按需求格式化输出 for name, total in points_sum.items(): print(f"{name}: {total} points ,")
方案2:基于itertools.groupby实现
需要先对原始数据按name字段排序,再用groupby分组后求和:
from itertools import groupby from operator import itemgetter data = [ {'name': 'Jack', 'points': 10}, {'name': 'John', 'points': 12}, {'name': 'Jack', 'points': 15}, {'name': 'Harry', 'points': 11} ] # 先按name排序,保证同name的元素相邻 sorted_data = sorted(data, key=itemgetter('name')) # 分组求和 points_sum = { name: sum(map(itemgetter('points'), group)) for name, group in groupby(sorted_data, key=itemgetter('name')) } # 格式化输出同上
方案3:基于pandas实现(适合大数据量场景)
如果可以引入第三方库,pandas的groupby语法更简洁,性能也更好:
import pandas as pd data = [ {'name': 'Jack', 'points': 10}, {'name': 'John', 'points': 12}, {'name': 'Jack', 'points': 15}, {'name': 'Harry', 'points': 11} ] points_sum = pd.DataFrame(data).groupby('name')['points'].sum().to_dict() # 格式化输出同上
三种方案最终输出都和你要求的结果完全一致。
内容的提问来源于stack exchange,提问作者Green Panda
相关产品推荐
相关产品推荐

