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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:02