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

如何使用推导式实现字典列表到列表值字典的转换?

问题:能否用推导式实现字典列表的分组合并?

现有字典列表:

s = [ {'I':1}, {'I':2}, {'R':29}, {'R':33} ]

目标是生成如下字典:

{ 'I':[1,2], 'R':[29,33] }

目前通过以下循环代码实现需求:

d = {'I':[], 'R':[]}
for i in s:
    for k,v in i.items():
        d[k].append(v)

想确认是否可以用推导式完成同样的任务。


回答

当然可以,根据是否提前知道目标键,有几种不同的实现方式:

1. 已知键时的纯字典推导式

如果已经明确要处理的键(比如这里的I和R),可以直接用字典推导式结合生成器表达式筛选对应值:

d = {k: [v for item in s for key, v in item.items() if key == k] for k in ['I', 'R']}

一行代码直接生成目标字典,无需提前初始化。

2. 未知键时的简洁写法(结合collections.defaultdict)

如果不确定列表里会出现哪些键,用defaultdict能更灵活地自动分组,虽然不是纯推导式,但写法比原循环更简洁:

from collections import defaultdict

d = defaultdict(list)
for item in s:
    for k, v in item.items():
        d[k].append(v)
# 若需要转为普通字典,执行 d = dict(d) 即可

3. 用itertools.groupby的推导式方案

如果要处理不固定的键,也可以结合groupby实现,但注意groupby要求序列先按分组键排序:

from itertools import groupby

# 先将每个字典转为键值元组,再按键排序
sorted_pairs = sorted((next(iter(item.items())) for item in s), key=lambda x: x[0])
d = {key: [val for _, val in group] for key, group in groupby(sorted_pairs, key=lambda x: x[0])}

这种方式适合数据量较大且键未知的场景,但排序步骤会带来少量性能开销。

对比原循环写法,推导式在已知键的情况下让代码更紧凑,而defaultdict的写法则平衡了简洁性和灵活性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:42:31