如何用Python将单键值字典列表转换为值为集合的字典?
解决方法:将单键字典列表转换为键对应值集合的字典
嘿,这个需求挺常见的,我来给你分享几种实用的Python实现方式,从基础到高效的都有,你可以根据自己的场景选:
首先先明确下示例场景,假设你的原始数据是这样的:
original_list = [ {"a": 1}, {"b": 2}, {"a": 3}, {"b": 2}, {"c": 5} ]
我们要得到的结果是:{"a": {1, 3}, "b": {2}, "c": {5}}
方法1:基础循环法(适合新手理解)
这种方式最直观,手动遍历处理每个字典,一步步构建结果:
result = {} for d in original_list: # 取出当前字典唯一的键值对(因为每个字典只有一个键) key, value = next(iter(d.items())) # 如果键还没在结果里,先初始化空集合 if key not in result: result[key] = set() # 把值添加到对应集合里 result[key].add(value)
这里用next(iter(d.items()))是因为每个字典只有一个键值对,直接取第一个(也是唯一一个)键值对就行,比用list(d.items())[0]更高效,不用生成整个列表。
方法2:用collections.defaultdict简化代码(推荐)
如果不想手动判断键是否存在,可以用Python标准库的defaultdict,它会自动为不存在的键初始化指定类型(这里是set):
from collections import defaultdict result = defaultdict(set) for d in original_list: key, value = next(iter(d.items())) result[key].add(value) # 如果你需要把结果转成普通的dict(而不是defaultdict),只需一步: result = dict(result)
这种方式代码更简洁,效率也和基础循环差不多,处理大数据量的时候体验更好。
方法3:一行式字典推导(适合小数据量)
如果追求代码简洁,也可以用字典推导来实现,不过这种方式的效率不如前两种(因为每个键都会遍历整个列表),适合数据量不大的场景:
# 先提取所有唯一的键,再为每个键收集对应的值集合 result = { key: {d[key] for d in original_list if key in d} for key in {k for d in original_list for k in d} }
外层的集合推导{k for d in original_list for k in d}用来获取所有不重复的键,内层的集合推导则收集每个键对应的所有值。
注意点
- 因为集合的特性,重复的值会自动被去重,这正好符合你的需求;
- 如果你原始字典里有多个键(虽然你说每个只有一个),那
next(iter(d.items()))只会取第一个键值对,这时候你可能需要调整逻辑,但按你的需求来说完全没问题。
内容的提问来源于stack exchange,提问作者sant016
相关产品推荐
相关产品推荐

