python collections模块 之 defaultdict
defaultdict 是 dict 的子类,因此 defaultdict 也可被当成 dict 来使用,dict 支持的功能,defaultdict 基本都支持。但它与 dict 最大的区别在于,如果程序试图根据不存在的 key 采访问 dict 中对应的 value,则会引发 KeyError 异常;而 defaultdict 则可以提供一个 default_factory 属性,该属性所指定的函数负责为不存在的 key 来生成 value。
from collections import defaultdict
my_dict = {}
# 使用int作为defaultdict的default_factory
# 将key不存在时,将会返回int()函数的返回值
my_defaultdict = defaultdict(int)
print(my_defaultdict['a']) #
print(my_dict['a']) # KeyError
上面程序分别创建了空的 dict 对象和 defaultdict 对象,当程序试图访问 defaultdict 中不存在的 key 对应的 value 时,程序输出 defaultdict 的 default_factory 属性(int 函数)的返回值 0;如果程序试图访问
dict 中不存在的 key 对应的 value,就会引发 KeyError 异常。 假如程序中包含多个 key-value 对数据,在这些 key-value 对中有些 key 是重复的,程序希望对这些 key-value 对进行整理,key 对应一个 list,该 list 中包含这组数据中该 key 对应的所有 value。
下面先使用普通 dict 来完成这项工作:
s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]
d = {}
for k, v in s:
# setdefault()方法用于获取指定key对应的value.
# 如果该key不存在,则先将该key对应的value设置为默认值:[]
d.setdefault(k, []).append(v)
print(list(d.items()))
正如从上面第 6 行代码所看到的,如果使用普通 dict 来处理,就需要处理 key 不存在的情况。程序中使用了 dict 的 setdefault() 方法,该方法用于获取指定 key 对应的 value,但如果该 key 不存在,setdefault() 方法就会先为该 key 设置一个默认的 value。
运行上面程序,可以看到如下输出结果:
[('Python', [1, 3, 9]), ('Swift', [2, 4])]
如果使用 defaultdict 来处理则简单得多,因为程序可以直接为 defaultdict 中不存在的 key 设置默认的 value。该处理程序如下:
from collections import defaultdict
s = [('Python', 1), ('Swift', 2), ('Python', 3), ('Swift', 4), ('Python', 9)]
# 创建defaultdict,设置由list()函数来生成默认值
d = defaultdict(list)
for k, v in s:
# 直接访问defaultdict中指定key对应的value即可。
# 如果该key不存在,defaultdict会自动为该key生成默认值
d[k].append(v)
print(list(d.items()))
对比该程序中的第 8 行代码和前一个程序中的第 6 行代码,不难发现使用 defaultdict 更加方便,原因是程序直接访问 defaultdict 中指定的 key 对应的 value,如果该 key 不存在,程序在创建 defaultdict 时传入的 list 函数将会为之生成默认的 value。
其他应用:
字符串中相同字符计数:
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
... d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]
字典中没有指定key时,返回任意指定值:
>>> def constant_factory(value):
... return lambda: value
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'
构建集合字典:
>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
... d[k].add(v)
...
>>> sorted(d.items())
[('blue', {2, 4}), ('red', {1, 3})]
python collections模块 之 defaultdict的更多相关文章
- (转)python collections模块详解
python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...
- Python collections模块总结
Python collections模块总结 除了我们使用的那些基础的数据结构,还有包括其它的一些模块提供的数据结构,有时甚至比基础的数据结构还要好用. collections ChainMap 这是 ...
- python collections模块
collections模块基本介绍 collections在通用的容器dict,list,set和tuple之上提供了几个可选的数据类型 namedtuple() factory function f ...
- Python collections 模块用法举例
Python作为一个“内置电池”的编程语言,标准库里面拥有非常多好用的模块.比如今天想给大家 介绍的 collections 就是一个非常好的例子. 1.collections模块基本介绍 我们都知道 ...
- Python——collections模块、time模块、random模块、os模块、sys模块
1. collections模块 (1)namedtuple # (1)点的坐标 from collections import namedtuple Point = namedtuple('poin ...
- Python——collections模块
collections模块 collections模块在内置数据类型(dict.list.set.tuple)的基础上,还提供了几个额外的数据类型:ChainMap.Counter.deque.def ...
- python collections模块详解
参考老顽童博客,他写的很详细,例子也很容易操作和理解. 1.模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提供了另一种选 ...
- python collections module's defaultdict
Collections is a high-performance container datatypes. defaultdict objects class collections.default ...
- Python——collections模块(扩展数据类型)
1.namedtuple:利用坐标.空间坐标,扑克牌等指定空间位置 # namedtuple('名字',[list列表属性])from collections import namedtuple Po ...
随机推荐
- leetcode-159周赛-5233-规划兼职工作*
方法: class Solution: def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[i ...
- 在vue中使用Element的message组件
在vue中使用Element的message组件 在vue文件中使用 this.$message({ message: "提示信息", type: "success&qu ...
- 自己的php框架
spl_autoload_register('imooc::load');当我们new的类不存在,将触发括号里的方法. is_file()判断文件是否存在.
- windows常用
host文件位置:C:\Windows\System32\drivers\etc
- dcoker安装redis
一.安装 搜索镜像 #docker search redis 拉取镜像 #docker pull redis 创建redis容器 #docker run -d --name redis --resta ...
- UvaLive6893_The_Big_Painting
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 Portal 原题目描述在最下面. 给你两个二 ...
- 20140321 sizeof 虚函数与虚函数表 静态数组空间 动态数组空间 位字段
1.静态的数组空间char a[10];sizeof 不能用于1:函数类型 2:动态的数组空间new3:位字段 函数类型:int fun();sizeof(fun())计算的是返回类型的大小,并不是函 ...
- Java 并发工具包——ExecutorService常用线程池
1. 执行器服务 ExecutorService java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务.因此一个 Executo ...
- maven javaProject打包发布成服务
1,现在pom.xml中添加打包所需要的jar包. <plugins> <plugin> <groupId>org.apache.maven.plugins< ...
- JavaScript 数组函数 map()
JavaScript 数组函数 map() 学习心得 map()函数是一个数组函数: 它对数组每个原素进行操作,不对空数组进行操作: 不改变原本的数组,返回新数组: arr.map(function( ...