4. python Collections -- Defaultdict objects

14人阅读

外语不好,机翻勿喷,方便回顾 (逃~


语法:

class collections.defaultdict([default_factory[...]])

    返回一个新的类似字典的对象。 defaultdict是内置的dict类的一个子类。 它覆盖一个方法并添加一个可写实例变量。 其余的功能与dict类相同,这里没有记录。

    第一个参数提供了default_factory属性的初始值; 它默认为None。 所有其余参数的处理方式与将它们传递给字典构造函数(包括关键字参数)相同。


除标准字典操作外,defaultdict对象还支持以下方法:

__missing__(key)

如果default_factory属性为None,则会引发KeyError异常,并将该键作为参数。

如果default_factory不是None,那么调用不带参数来为给定键提供默认值,将此值插入到键的字典中并返回。

如果调用default_factory引发异常,则此异常传播不变。

当找不到请求的键时,此方法由dict类的__getitem __()方法调用; 无论它返回还是提出,然后由__getitem __()返回或引发。

请注意,除__getitem __()之外,__missing __()不会被调用。 这意味着get()将像普通字典一样将None作为默认值返回,而不是使用default_factory。


defaultdict对象支持以下实例变量:

    default_factory

    该属性由__missing __()方法使用; 它会从第一个参数初始化为构造函数(如果存在),如果不存在,则初始化为None。


defaultdict 举例

使用list作为default_factory,可以很容易地将一系列键值对组合成一个列表字典:

image.png


当第一次遇到每个 key 时,它不在映射中; 所以会使用返回空列表的default_factory函数自动创建一个条目。

然后 list.append()操作将该值附加到新列表中。 

当再次遇到密钥时,查找正常进行(返回该密钥的列表),并且list.append()操作向列表添加另一个值。 

这种技术比使用dict.setdefault()的等效技术更简单快捷:(看图就懂了 - -!)

image.png


将default_factory设置为int可使defaultdict对计数有用(如其他语言中的bag或multiset):

image.png

当第一次遇到字母时,它在映射中不存在,因此default_factory函数调用int()以提供默认计数为零。 增量操作然后为每个字母建立计数。


总是返回零的函数int()只是常量函数的特例。 创建常量函数的更快更灵活的方法是使用可以提供任何常量值(不仅仅是零)的lambda函数:

image.png


设置default_factory可以使defaultdict用于构建集合的字典:

image.png

猜你喜欢

转载自blog.51cto.com/286577399/2128647