添加collections.defaultdict在Python中2.5大大减少了对dictsetdefault方法。这个问题是为了我们的集体教育:

  1. 什么是setdefault今天在Python 2.6/2.7中仍然有用吗?
  2. 哪些流行的用例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 )

来自: stackoverflow.com