在Python里面有一个模块collections,解释是数据类型容器模块。这里面有一个collections.defaultdict()经常被用到。主要说说这个东西。

综述:

这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。比如default(int)则创建一个类似dictionary对象,里面任何的values都是int的实例,而且就算是一个不存在的keyd[key] 也有一个默认值,这个默认值是int()的默认值0.

defaultdict 
dict subclass that calls a factory function to supply missing values。

这是一个简短的解释

defaultdict属于内建函数dict的一个子类,调用工厂函数提供缺失的值。

用法:

标准字典包括一个方法setdefault()来获取一个值,如果这个值不存在则建立一个默认值。与之相反,defaultdict初始化容器时会让调用者提前指定默认值。

import collections
def default_factory():
return 'default_value' d=collections.defaultdict(default_factory,foo='bar')
print 'd:',d
print 'foo=>',d['foo']
print 'bar=>',d['bar']

d: defaultdict(<function default_factory at 0x01BFAB70>, {'foo': 'bar'})
foo=> bar
bar=> default_value
>>> d['key']
'default_value'
>>>

我现在调用d['xx']也会输出default_value

上面的等同于:

d=collections.defaultdict(lambda :'default_value',foo='bar')

只要所有键都有相同的默认值并无不妥,就可以使用这个方法。如果默认值是一种用于聚集或累加值的类型,如list、set或者甚至是int,这个方法尤其有用。标准库文档提供了很多采用这种方式使用defaultdict的例子。

一般用法:

需要使用字典作为跟踪数据的容器时,defaultdict对象很有用。例如跟踪字符串s中每个单词的位置。

>>> from collections import defaultdict

>>> s="ashin chen C ashin chen C ashin chen C"

>>> words = s.split()

>>> wordlocations=defaultdict(list)

>>> for n, w in enumerate(words):

...   wordlocations[w].append(n)

...

>>> wordlocations

defaultdict(<type 'list'>, {'ashin': [0, 3, 6], 'chen': [1, 4, 7], 'C': [2, 5, 8]})

>>>

wordlocations[w]在遇到第一个单词时将失败,但是不会抛出异常,而是调用作为default_factory提供的函数list来创建一个新值。

相当于wordlocations.setdefault(w, []).append(n)。但是这个速率会慢两倍。

import collections
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] # defaultdict
d = collections.defaultdict(list)
for k, v in s:
d[k].append(v) # Use dict and setdefault
g = {}
for k, v in s:
g.setdefault(k, []).append(v)

defaultdict和dict就如同上面。

http://kodango.com/defaultdict-in-python

跟多参考:http://www.cnblogs.com/herbert/archive/2013/01/09/2852843.html

python defaultdict 类型的更多相关文章

  1. Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  2. Python变量类型

    Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...

  3. Python变量类型(l整型,长整形,浮点型,复数,列表,元组,字典)学习

    #coding=utf-8 __author__ = 'Administrator' #Python变量类型 #Python数字,python支持四种不同的数据类型 int整型 long长整型 flo ...

  4. Python序列类型

    Python序列类型 序列:字符.列表.元组 所有序列都支持迭代 序列表示索引为非负整数的有序对象集合 字符和元组属于不可变序列,列表可变 1)字符 字符串字面量:把文本放入单引号.双引号或三引号中: ...

  5. Python对象类型及其运算

    Python对象类型及其运算 基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = ...

  6. Python学习笔记(二)-Python文件类型及编程模式

    Python环境搭建:linux,Windows... Linux下:[root@localhost StudyPython]# python #进入交互模式Python 2.7.11 (defaul ...

  7. python动态类型

    在python中,省去了变量声明的过程,在引用变量时,往往一个简单的赋值语句就同时完成了,声明变量类型,变量定义和关联的过程,那么python的变量到底是怎样完成定义的呢? 动态类型 python使用 ...

  8. [Python]基础教程(4)、Python 变量类型

    Python 变量类型 变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据 ...

  9. 5、Python文件类型

    Python文件类型 源代码 Python源代码的文件以"py"为扩展名,由Python程序解释,不需要编译 字节代码 Python源文件经编译后生成的扩展名为"pyc& ...

随机推荐

  1. C++数据类型简析

    C++语言的基本数据类型有如下四种: 整型,说明符为int: 字符型,说明符为char: 浮点型(又称实型),说明符为float(单精度),double(双精度): 空值型,说明符为void,用于函数 ...

  2. js简单实现链式调用

    链式调用实现原理:对象中的方法执行后返回对象自身即可以实现链式操作.说白了就是每一次调用方法返回的是同一个对象才可以链式调用. js简单实现链式调用demo Object.prototype.show ...

  3. virtualBox文件共享

    具体过程,可以参考: http://jingyan.baidu.com/article/2fb0ba40541a5900f2ec5f07.html 共享命令:sudo mount -t vboxsf ...

  4. PHP学习(前言)

    PHP学习(前言) 都说做IT技术的都该写写博客,以前没写过,现在开始写写吧.不是给别人看,就当是自己的学习笔记了. 大三结束了,该找工作了,对web前端感兴趣,想从事前端工作,自然要会一门后台语言了 ...

  5. ThinkPHP中的CURD操作

    <?php //查询多条记录,返回二维数组 $result = M("admin")->select(); $result = M("admin") ...

  6. Java I/O theory in system level

    参考文章: JAVA NIO之浅谈内存映射文件原理与DirectMemory Java NIO 2.0 : Memory-Mapped Files | MappedByteBuffer Tutoria ...

  7. python 之日期时间处理

    ##python时间操作一般使用time.datetime两个模块 对于time模块,时间的表示模式有3种1.时间戳:time.time()2.字符串: time.strftime('%Y%m%d') ...

  8. ExtJS 修改load paging时的参数

    ExtJS 的pagingToolbar 在翻页的时候传入的参数是固定的  分别是start 和 limit(其中limit的值就是store.pageSize的值) 如何在每次翻页的时候传入自己的参 ...

  9. win7系统中桌面图标显示不正常问题

    http://jingyan.baidu.com/article/466506580c9327f549e5f8dc.html 最近笔者在安装软件时,突然出现了桌面图标显示不正常了,一开始还以为是新安装 ...

  10. MySQL 表分区的几种方法和注意

    分区方法1:Hash分区 例子: create table thash(x int ,y int) partition by hash(x) partitions 4; 就这么一句话表就分好区了.下一 ...