Python2.5中添加的collections.defaultdict大大减少了对dict的setdefault方法的需求。这个问题是为了我们的集体教育:
setdefault的用途是什么?setdefault的哪些流行用例已被Python2.6/2.7取代发布于 2010-08-14 22:05:51
您可以说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 )发布于 2010-08-14 23:01:17
我通常将setdefault用于关键字参数判定,例如在下面的函数中:
def notify(self, level, *pargs, **kwargs):
    kwargs.setdefault("persist", level >= DANGER)
    self.__defcon.set(level, **kwargs)
    try:
        kwargs.setdefault("name", self.client.player_entity().name)
    except pytibia.PlayerEntityNotFound:
        pass
    return _notify(level, *pargs, **kwargs)它非常适合于在接受关键字参数的函数的包装器中调整参数。
发布于 2011-05-30 15:54:58
当缺省值为静态时,defaultdict非常好用,就像一个新列表一样,但如果它是动态的,就不太好用了。
例如,我需要一个字典来将字符串映射到唯一的int。defaultdict(int)将始终使用0作为默认值。同样,defaultdict(intGen())始终生成1。
取而代之的是,我使用了常规的字典:
nextID = intGen()
myDict = {}
for lots of complicated stuff:
    #stuff that generates unpredictable, possibly already seen str
    strID = myDict.setdefault(myStr, nextID())请注意,dict.get(key, nextID())是不够的,因为我还需要能够在稍后引用这些值。
intGen是我构建的一个小类,它自动递增一个整数并返回它的值:
class intGen:
    def __init__(self):
        self.i = 0
    def __call__(self):
        self.i += 1
    return self.i如果有人能用defaultdict做到这一点,我很乐意看到。
https://stackoverflow.com/questions/3483520
复制相似问题