问题描述
你可以说defaultdict
是设置默认有用 填充字典之前 和setdefault
是设置默认值有用 ,同时或填充字典之后 。
可能是最常见的用例:对项目进行分组(在未排序的数据中,否则使用itertools.groupby
)
# really verbose
new = {}
for (key, value) in data:
if key in new:
new[key].append( value )
else:
new[key] = [value]
# easy with setdefault
new = {}
for (key, value) in data:
group = new.setdefault(key, []) # key might exist already
group.append( value )
# even simpler with defaultdict
from collections import defaultdict
new = defaultdict(list)
for (key, value) in data:
new[key].append( value ) # all keys have a default already
有时您想确保在创建字典后存在特定的键。defaultdict
在这种情况下不起作用,因为它仅在显式访问时创建密钥。认为您使用的HTTP带有很多标头-
有些标头是可选的,但您希望使用它们的默认值:
headers = parse_headers( msg ) # parse the message, get a dict
# now add all the optional headers
for headername, defaultvalue in optional_headers:
headers.setdefault( headername, defaultvalue )
解决方法
加入collections.defaultdict
在Python
2.5大大降低用于需要dict
的setdefault
方法。这个问题是针对我们的集体教育:
- 什么是
setdefault
仍然有用,今天在Python 2.6 / 2.7? setdefault
取代了哪些流行的用例collections.defaultdict
?