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
相关产品推荐
相关产品推荐

