defaultdict 是 dict 的子类,因此 defaultdict 也可被当成 dict 来使用,dict 支持的功能,defaultdict 基本都支持。但它与 dict 最大的区别在于,如果程序试图根据不存在的 key 采访问 dict 中对应的 value,则会引发 KeyError 异常;而 defaultdict 则可以提供一个 default_factory 属性,该属性所指定的函数负责为不存在的 key 来生成 value。

  1. from collections import defaultdict
  2. my_dict = {}
  3. # 使用int作为defaultdict的default_factory
  4. # 将key不存在时,将会返回int()函数的返回值
  5. my_defaultdict = defaultdict(int)
  6. print(my_defaultdict['a']) #
  7. print(my_dict['a']) # KeyError
  1. 上面程序分别创建了空的 dict 对象和 defaultdict 对象,当程序试图访问 defaultdict 中不存在的 key 对应的 value 时,程序输出 defaultdict default_factory 属性(int 函数)的返回值 0;如果程序试图访问
    dict 中不存在的 key 对应的 value,就会引发 KeyError 异常。
  2.  
  3. 假如程序中包含多个 key-value 对数据,在这些 key-value 对中有些 key 是重复的,程序希望对这些 key-value 对进行整理,key 对应一个 list,该 list 中包含这组数据中该 key 对应的所有 value
    下面先使用普通 dict 来完成这项工作:
  1. s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]
  2. d = {}
  3. for k, v in s:
  4. # setdefault()方法用于获取指定key对应的value.
  5. # 如果该key不存在,则先将该key对应的value设置为默认值:[]
  6. d.setdefault(k, []).append(v)
  7. print(list(d.items()))

正如从上面第 6 行代码所看到的,如果使用普通 dict 来处理,就需要处理 key 不存在的情况。程序中使用了 dict 的 setdefault() 方法,该方法用于获取指定 key 对应的 value,但如果该 key 不存在,setdefault() 方法就会先为该 key 设置一个默认的 value。

运行上面程序,可以看到如下输出结果:

  1. [('Python', [1, 3, 9]), ('Swift', [2, 4])]

如果使用 defaultdict 来处理则简单得多,因为程序可以直接为 defaultdict 中不存在的 key 设置默认的 value。该处理程序如下:

  1. from collections import defaultdict
  2. s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]
  3. # 创建defaultdict,设置由list()函数来生成默认值
  4. d = defaultdict(list)
  5. for k, v in s:
  6. # 直接访问defaultdict中指定key对应的value即可。
  7. # 如果该key不存在,defaultdict会自动为该key生成默认值
  8. d[k].append(v)
  9. print(list(d.items()))

对比该程序中的第 8 行代码和前一个程序中的第 6 行代码,不难发现使用 defaultdict 更加方便,原因是程序直接访问 defaultdict 中指定的 key 对应的 value,如果该 key 不存在,程序在创建 defaultdict 时传入的 list 函数将会为之生成默认的 value。

其他应用:

字符串中相同字符计数:

  1. >>> s = 'mississippi'
  2. >>> d = defaultdict(int)
  3. >>> for k in s:
  4. ... d[k] += 1
  5. ...
  6. >>> sorted(d.items())
  7. [('i', 4), ('m', 1), ('p', 2), ('s', 4)]

字典中没有指定key时,返回任意指定值:

  1. >>> def constant_factory(value):
  2. ... return lambda: value
  3. >>> d = defaultdict(constant_factory('<missing>'))
  4. >>> d.update(name='John', action='ran')
  5. >>> '%(name)s %(action)s to %(object)s' % d
  6. 'John ran to <missing>'

构建集合字典:

  1. >>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
  2. >>> d = defaultdict(set)
  3. >>> for k, v in s:
  4. ... d[k].add(v)
  5. ...
  6. >>> sorted(d.items())
  7. [('blue', {2, 4}), ('red', {1, 3})]
  1.  

python collections模块 之 defaultdict的更多相关文章

  1. (转)python collections模块详解

    python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...

  2. Python collections模块总结

    Python collections模块总结 除了我们使用的那些基础的数据结构,还有包括其它的一些模块提供的数据结构,有时甚至比基础的数据结构还要好用. collections ChainMap 这是 ...

  3. python collections模块

    collections模块基本介绍 collections在通用的容器dict,list,set和tuple之上提供了几个可选的数据类型 namedtuple() factory function f ...

  4. Python collections 模块用法举例

    Python作为一个“内置电池”的编程语言,标准库里面拥有非常多好用的模块.比如今天想给大家 介绍的 collections 就是一个非常好的例子. 1.collections模块基本介绍 我们都知道 ...

  5. Python——collections模块、time模块、random模块、os模块、sys模块

    1. collections模块 (1)namedtuple # (1)点的坐标 from collections import namedtuple Point = namedtuple('poin ...

  6. Python——collections模块

    collections模块 collections模块在内置数据类型(dict.list.set.tuple)的基础上,还提供了几个额外的数据类型:ChainMap.Counter.deque.def ...

  7. python collections模块详解

    参考老顽童博客,他写的很详细,例子也很容易操作和理解. 1.模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提供了另一种选 ...

  8. python collections module's defaultdict

    Collections is a high-performance container datatypes. defaultdict objects class collections.default ...

  9. Python——collections模块(扩展数据类型)

    1.namedtuple:利用坐标.空间坐标,扑克牌等指定空间位置 # namedtuple('名字',[list列表属性])from collections import namedtuple Po ...

随机推荐

  1. git Web

    { …or create a new repository on the command line   echo "# Kotlin" >> README.md git ...

  2. Delphi StringGrid常用属性和常用操作

    StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控制网格外观念的属性,以及利用表格的结构响应用户操作的事 ...

  3. 阿里云POLARDB如何帮助百胜软件应对数据库的“巅峰时刻”

    POLARDB是阿里云自研的下一代关系型云数据库,100%兼容MySQL,存储容量最高可达100TB,性能最高提升至MySQL的6倍,适用于企业多样化的数据库应用场景.POLARDB采用存储和计算分离 ...

  4. 使用Sonatype Nexus搭建Maven私服后,如何添加第三方JAR包

    使用Sonatype Nexus搭建Maven私服后如何添加第三方JAR包 步骤如下 1.打开nexus地址,进行登录 2.登录Nexus后,点击右侧的“Repositories”,显示当前Nexus ...

  5. TopCoder[SRM587 DIV 1]:ThreeColorability(900)

    Problem Statement      There is a H times W rectangle divided into unit cells. The rows of cells are ...

  6. 关于Mysql分区和分表

    [分区概念]分区就是把一张表的数据按照一定的规则分成多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上.分区后表还是一张表.分区根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.pa ...

  7. 顺时针打印矩阵元素(python实现)

    我觉得我的算法比较简单易懂,比网上的那些简单些.至于时间复杂度就没有比较了. 算法思想:从最外层向内层遍历矩阵 # my algorithmimport math def print_matrix(m ...

  8. 面试39 MySQL读写分离

    (1)如何实现mysql的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. (2)MySQL主从复制原 ...

  9. Spark RDD基本操作

  10. 5.从物理层到MAC层

    第一层(物理层)     如何用两台电脑构成最小的局域网(LAN)?     网线的水晶头1.2和3.6脚分别起着收.发信号的作用,随意只要将水晶头做交叉线1-3.2-6交叉法,然后连接两台电脑.除了 ...