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

如何使用reduce或字典推导式将列表转换为ID对应列表的分组字典

常用简洁实现方案

1. collections.defaultdict 实现(最推荐,可读性和性能最优)

这是工业界最常用的分组写法,比原生循环简洁很多:

from collections import defaultdict

result = defaultdict(list)
for row in rows:
    result[row["type_id"]].append(row)

# 如果需要得到原生字典类型,额外加一步转换即可
# result = dict(result)

2. functools.reduce 实现

如果要求必须用reduce实现,可以用如下写法:

from functools import reduce
from collections import defaultdict

result = reduce(
    lambda acc, row: acc[row["type_id"]].append(row) or acc,
    rows,
    defaultdict(list)
)

如果不想依赖defaultdict,也可以用普通字典的setdefault方法实现:

from functools import reduce

result = reduce(
    lambda acc, row: (acc.setdefault(row["type_id"], []).append(row), acc)[1],
    rows,
    {}
)

说明:这里的语法是利用了append返回None的特性,通过元组取值拿到更新后的字典对象


3. 字典推导式实现

字典推导式本身不支持状态累积,需要配合itertools.groupby实现,注意该方案要求数据先按分组键排序,否则相同type_id的不连续行会被拆分为多个分组:

from itertools import groupby

# 如果rows已经按type_id排序可以跳过排序步骤
sorted_rows = sorted(rows, key=lambda x: x["type_id"])
result = {type_id: list(group) for type_id, group in groupby(sorted_rows, key=lambda x: x["type_id"])}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:01