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

Python嵌套字典追加:defaultdict(lambda: defaultdict(set))实现

实现方法

直接用标准库collections.defaultdict就能去掉所有手动判断键是否存在的冗余代码,逻辑简洁还不容易写错。

对应你给出的目标结构(集合去重版)

你示例里的fruits和colors是无重复值的集合,直接用下面的代码即可:

from collections import defaultdict

namedict = defaultdict(lambda: {"fruits": set(), "colors": set()})
db_rows = execute_query(cursor, args.store_proc)

for row in db_rows:
    namedict[row.id]["fruits"].add(row.fruit)
    namedict[row.id]["colors"].add(row.color)

逻辑说明:

  • 访问不存在的Name键时,defaultdict会自动执行传入的lambda,生成带空fruits、空colors集合的初始化字典,完全不需要手写if db_name in namedict的分支判断
  • 集合的add()方法天然去重,同一个Name下重复的水果、颜色只会存一次,和你要的目标结构完全匹配
  • 这种写法固定了内层字典只有fruits、colors两个键,如果你手滑拼错键名(比如把colors写成color)会直接抛KeyError,比你设想的defaultdict(lambda: defaultdict(set))更稳妥——后者遇到写错的键名会自动生成新的空集合,排查问题很麻烦。

保留重复值的列表版

如果你不需要去重,要保留数据库返回的原始顺序和重复值,把集合换成列表,用append()添加元素就行:

from collections import defaultdict

namedict = defaultdict(lambda: {"fruits": [], "colors": []})

for row in db_rows:
    namedict[row.id]["fruits"].append(row.fruit)
    namedict[row.id]["colors"].append(row.color)

无导入的原生字典写法

如果不想导入collections模块,用字典自带的setdefault()也能实现,只是简洁度稍差:

namedict = {}

for row in db_rows:
    entry = namedict.setdefault(row.id, {"fruits": set(), "colors": set()})
    entry["fruits"].add(row.fruit)
    entry["colors"].add(row.color)

补充:你最开始手写的代码里就有键名不一致的笔误——分支里写的是color,目标结构里是colors,这类低级错误在写冗余的键判断分支时非常常见,统一初始化结构的写法能直接避免这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:01:10