如何使用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
相关产品推荐
相关产品推荐

