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

如何更优雅地从深度为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()]属于多余操作:

  1. 先对每个子字典的值转集合再转列表,既浪费性能又无必要——最终还要再转一次集合完成全局去重
  2. 嵌套列表推导+生成器的写法增加了代码复杂度,可读性远不如直接的嵌套生成器或itertools实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:39:34