添加collections.defaultdict
在Python中2.5大大减少了对dict
’setdefault
方法。这个问题是为了我们的集体教育:
- 什么是
setdefault
今天在Python 2.6/2.7中仍然有用吗? - 哪些流行的用例
setdefault
被取代了collections.defaultdict
?
答案
你可以说defaultdict
对于设置默认值有用在填写案例之前 和setdefault
对于设置默认值有用填充dict或之后。
可能是最常见的用例:分组项目(在未排序的数据中,否则使用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
有时,您想确保在创建dict之后存在特定的键。defaultdict
在这种情况下不起作用,因为它仅在显式访问时创建密钥。认为您在许多标头中使用http-ish的东西 - 有些是可选的,但您想要默认值:
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 )