如何通过排他方式更新dict?寻求无需重复指定键的内置方案
Great question! I totally get the annoyance of repeating key names when adding new entries to a dict—small as it is, it’s one of those little friction points that adds up. Luckily, Python has two built-in (or standard library) solutions that let you avoid repeating the key, no custom functions needed:
1. 使用字典自带的 setdefault() 方法
这是最直接的原生方案,不需要导入任何模块,适合单次或偶尔的操作。
原来的重复写法(需要两次写键名):
my_dict = {} if 'a' not in my_dict: my_dict['a'] = [] my_dict['a'].append('hello')
优化后(只写一次键名):
my_dict = {} my_dict.setdefault('a', []).append('hello')
原理:setdefault(key, default) 会先检查字典中是否存在 key:
- 如果不存在,就把
key: default加入字典,然后返回default - 如果已经存在,直接返回对应的值
这样你可以直接链式调用操作(比如 append),全程只需要写一次键名。而且它不会覆盖已存在的键值,非常安全。
2. 使用 collections.defaultdict
如果你需要给所有新增键设置相同类型的默认值(比如默认是空列表、0、空字典等),defaultdict 会更省心,它是标准库 collections 里的内置类,不需要自己写任何逻辑。
示例:
from collections import defaultdict # 初始化时指定默认工厂:所有不存在的键默认返回空列表 my_dict = defaultdict(list) # 直接操作新键,自动创建并赋值默认值,只写一次键名 my_dict['a'].append('hello') my_dict['b'].append('world')
原理:defaultdict 会在你访问不存在的键时,自动调用你指定的工厂函数(比如 list() 生成空列表,int() 生成0),同时把这个键加入字典。这种方式特别适合批量处理同类键的场景,不用每次都写 setdefault。
额外说明
如果你不想导入任何模块,setdefault() 是最优选择;如果是大量重复的同类操作,defaultdict 会让代码更简洁。Python的普通字典本身不支持自动创建不存在的键(除非自定义子类,但这比写函数还麻烦,显然不符合你的需求),所以上面两个就是最适合的内置实现了。
内容的提问来源于stack exchange,提问作者Tcll

