如何更优雅地从深度为1的嵌套字典中提取值存入集合?
更优雅的嵌套字典值提取实现方式
你的需求是从深度为1的嵌套字典中提取所有值并去重存入集合,现有代码里的中间集合与列表转换属于冗余操作,这里提供两种更简洁优雅的实现方案:
方法一:嵌套生成器表达式直接转换
直接遍历所有子字典的值,最后统一转为集合(集合会自动完成去重),逻辑清晰且代码极简:
d = {1: {10: 'a', 11: 'b'}, 2: {20: 'a', 21: 'c'}} result = set(val for sub_dict in d.values() for val in sub_dict.values()) print(result) # {'a', 'b', 'c'}
这种写法去掉了不必要的中间转换步骤,核心逻辑一目了然:先遍历外层字典的所有子字典,再遍历每个子字典的值,最后用set()一次性完成去重与集合转换。
方法二:使用itertools.chain扁平化迭代器
如果偏好更清晰的扁平化操作逻辑,可以借助itertools.chain合并所有子字典的值序列,再转集合:
from itertools import chain d = {1: {10: 'a', 11: 'b'}, 2: {20: 'a', 21: 'c'}} result = set(chain.from_iterable(sub_dict.values() for sub_dict in d.values())) print(result) # {'a', 'b', 'c'}
chain.from_iterable()会把多个可迭代对象(这里是每个子字典的values())合并成一个连续迭代器,再转集合去重,可读性较强,也适合扩展到更复杂的可迭代对象合并场景。
现有代码的冗余点说明
你原代码中的[[*set(a.values())] for a in d.values()]属于多余操作:
- 先对每个子字典的值转集合再转列表,既浪费性能又无必要——最终还要再转一次集合完成全局去重
- 嵌套列表推导+生成器的写法增加了代码复杂度,可读性远不如直接的嵌套生成器或
itertools实现
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

