如何使用推导式实现字典列表到列表值字典的转换?
问题:能否用推导式实现字典列表的分组合并?
现有字典列表:
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
相关产品推荐
相关产品推荐

