首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“setdefault”dict方法的用例

“setdefault”dict方法的用例
EN

Stack Overflow用户
提问于 2010-08-14 21:32:58
回答 17查看 111.4K关注 0票数 211

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

  1. 在Python2.6/2.7中,setdefault的用途是什么?
  2. setdefault的哪些流行用例已被Python2.6/2.7取代
EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-08-14 22:05:51

您可以说defaultdict在填写字典之前用于设置默认值,而setdefault用于在填写字典时或之后设置默认值。

最常见的用例可能是:对项进行分组(在未排序的数据中,否则使用itertools.groupby)

代码语言:javascript
运行
复制
# 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 --其中一些是可选的,但您希望它们是默认值:

代码语言:javascript
运行
复制
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 )
票数 231
EN

Stack Overflow用户

发布于 2010-08-14 23:01:17

我通常将setdefault用于关键字参数判定,例如在下面的函数中:

代码语言:javascript
运行
复制
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)

它非常适合于在接受关键字参数的函数的包装器中调整参数。

票数 35
EN

Stack Overflow用户

发布于 2011-05-30 15:54:58

当缺省值为静态时,defaultdict非常好用,就像一个新列表一样,但如果它是动态的,就不太好用了。

例如,我需要一个字典来将字符串映射到唯一的int。defaultdict(int)将始终使用0作为默认值。同样,defaultdict(intGen())始终生成1。

取而代之的是,我使用了常规的字典:

代码语言:javascript
运行
复制
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是我构建的一个小类,它自动递增一个整数并返回它的值:

代码语言:javascript
运行
复制
class intGen:
    def __init__(self):
        self.i = 0

    def __call__(self):
        self.i += 1
    return self.i

如果有人能用defaultdict做到这一点,我很乐意看到。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3483520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档