我们都知道,Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型:

(1)namedtuple(): 生成可以使用名字来访问元素内容的tuple子类 
(2)deque: 双端队列,可以快速的从另外一侧追加和推出对象 
(3)Counter: 计数器,主要用来计数 
(4)OrderedDict: 有序字典 
(5)defaultdict: 带有默认值的字典

=>namedtuple(typename, field_names, verbose=False, rename=False)

比如我们用户拥有一个这样的数据结构,每一个对象是拥有三个元素的tuple。
使用namedtuple方法就可以方便的通过tuple来生成可读性更高也更好用的数据结构

wdebsites = [

('Sohu', 'http://www.google.com/', '张朝阳'),

('Sina', 'http://www.sina.com.cn/', '王志东'),

('163', 'http://www.163.com/', '丁磊')

]

Website = namedtuple('Website', ['name', 'url', 'founder'])

for website in websites:

website = Website._make(website)

print (website)

Result:

Website(name='Sohu', url='http://www.google.com/', founder='张朝阳')

Website(name='Sina', url='http://www.sina.com.cn/', founder='王志东')

Website(name='163', url='http://www.163.com/', founder='丁磊')

=>deque(iterable,maxlen)

deque其实是double-ended queue的缩写,翻译过来就是双端队列,它最大的好处就是实现了从队列头部快速增加和取出对象: .popleft(), .appendleft()。原生的List也能从头部添加和去除对象,l.insert(0, v)、l.pop(0)。但是值得注意的是,list对象的这两种用法的时间复杂度是O(n),也就是说随着元素数量的增加耗时呈线性上升。而使用deque对象则是O(1) 的复杂度,所以当你的代码有这样的需求的时候,一定要记得使用deque。

作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate等。

append(x):从队列末尾添加x

appendleft(x):从队列头部添加x

clear():清空队列

count(x):返回队列中x的数量

extend(iterable):在队列的尾部添加多个元素

extendleft(iterable):在队列的头部添加多个元素,反序插入(字母表相反顺序)

pop():将尾部一个元素移除

popleft():将头部一个元素移除

remove(x):将队列中第一次出现的x元素移除

reverse():将队列元素逆置

rotate(n):将队列尾部的n个元素添加到头部 rotate(1)等价于:d.appendleft(d.pop())

D.maxlen:返回队列的长度,如果是无界则返回None(定义的时候可以指定maxlen,否则默认是无界队列)

Example:

>>>d=collections.deque("gsgwqeasas")

>>> d

deque(['g', 's', 'g', 'w', 'q', 'e', 'a', 's', 'a', 's'])

>>> s=list(d)

>>> s

['w', 'g', 'g', 's', 'a', 's', 'a', 'e', 'q']

=>Counter(iterable or mapping)  #可迭代或者映射的对象

计数器是一个非常常用的功能需求。

elements():返回一个重复元素的迭代器,重复次数和计数的次数一样多。元素以任意顺序返回。如果一个元素的计数小于1,elements()会忽略它。

most_common([n]):返回n个计数器元素,若未指定n,则返回计数器的所有元素

update(iterable or mapping):增加计数器元素,元素可以来源于迭代对象或者一个Counter对象

Example:

>>> s

['w', 'g', 'g', 's', 'a', 's', 'a', 'e', 'q']

>>> c=collections.Counter(s)

>>> c

Counter({'g': 2, 'a': 2, 's': 2, 'e': 1, 'q': 1, 'w': 1})

>>> list(c)

['e', 'q', 'g', 'w', 'a', 's']

>>> dict(c)

{'a': 2, 'q': 1, 'g': 2, 'w': 1, 'e': 1, 's': 2}

>>> list(c.elements())

['e', 'q', 'g', 'g', 'w', 'a', 'a', 's', 's']

>>> c.most_common(4)

[('g', 2), ('a', 2), ('s', 2), ('e', 1)]

>>> c.update('fds')

>>> c

Counter({'s': 3, 'g': 2, 'a': 2, 'e': 1, 'q': 1, 'w': 1, 'f': 1, 'd': 1})

>>> c.update(c)

>>> c

Counter({'s': 6, 'g': 4, 'a': 4, 'e': 2, 'q': 2, 'w': 2, 'f': 2, 'd': 2})

>>>

=>OrderedDict(items)

在Python中,dict这个数据结构由于hash的特性,是无序的,这在有的时候会给我们带来一些麻烦, 幸运的是,collections模块为我们提供了OrderedDict,当你要获得一个有序的字典对象时,用它就对了。

popitem(last=True):移除字典对象元素,last=True时“后进先出”,last=False时“先进先出”

move_to_end(key,last=True):将字典中一个已经存在的键移动到头部或者尾部。last=True时,移动到尾部,last=False时,移动到头部。

Example:

>>> d

{'w': 2, 'a': 4, 'f': 2, 'q': 2, 'g': 4, 'd': 2, 'e': 2, 's': 6}

>>> n=collections.OrderedDict(d)

>>> n

OrderedDict([('w', 2), ('a', 4), ('f', 2), ('q', 2), ('g', 4), ('d', 2), ('e', 2), ('s', 6)])

>>> n.popitem()

('s', 6)

>>> n

OrderedDict([('a', 4), ('f', 2), ('q', 2), ('g', 4), ('d', 2), ('e', 2)])

>>> n.move_to_end('f')

>>> n

OrderedDict([('a', 4), ('q', 2), ('g', 4), ('d', 2), ('e', 2), ('f', 2)])

=>defaultdict

我们都知道,在使用Python原生的数据结构dict的时候,如果用 d[key] 这样的方式访问, 当指定的key不存在时,是会抛出KeyError异常的。

但是,如果使用defaultdict,只要你传入一个默认的工厂方法,那么请求一个不存在的key时, 便会调用这个工厂方法使用其结果来作为这个key的默认值。

Example:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

>>> d = defaultdict(list)

>>> for k, v in s:

d[k].append(v)

>>> list(d.items())

[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

>>> m =dict()

>>> m["a"]

Traceback (most recent call last):

File"<stdin>", line1,in<module>

KeyError: "a"

>>>

>>> m =collections.defaultdict(int)

>>> m["a"]

0

>>> m["b"]

0

>>> m =collections.defaultdict(str)

>>> m["a"]

""

>>> m["b"]+="a"

>>> m["b"]

"a"

>>> m =collections.defaultdict(lambda:"[default value]")

>>> m["a"]

"[default value]"

>>> m["b"]

"[default value]"

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

  1. python模块介绍- collections(5)-OrderedDict 有序字典

    1.3.5 OrderedDict 有序字典 OrderedDict是dict的子类,它记住了内容添加的顺序. import collections print 'Regular dictionary ...

  2. Python模块:collections

    collections模块常用的数据类型: (1)namedtuple(): #创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素. fr ...

  3. python模块之collections random

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

  4. python模块之collections模块

    计数器 Counter 计数元素迭代器 elements() 计数对象拷贝 copy() 计数对象清空 clear() from collections import Counter #import ...

  5. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  6. python的常用模块之collections模块

    python的常用模块之collections模块 python全栈开发,模块,collections 认识模块 什么是模块?    常见的场景:一个模块就是一个包含了python定义和声明的文件,文 ...

  7. Python自建collections模块

    本篇将学习python的另一个内建模块collections,更多内容请参考:Python学习指南 collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtupl ...

  8. python拓展2 collections模块与string模块

    知识内容 1.collections模块介绍 2.collections模块使用 3.string模块介绍及使用 一.collections模块介绍 collections模块中提供了很多python ...

  9. Python标准库——collections模块的Counter类

    1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...

随机推荐

  1. 用代码来理解 C#委托与事件

    C#中委托是什么?事件是委托吗? 1.委托是讲方法作为参数代入另一个方法中, 委托可以理解为指向一个函数的引用. class Program { public delegate void Delega ...

  2. noi 1944 吃糖果

    题目链接:http://noi.openjudge.cn/ch0206/1944/ 根据第一天吃的个数递推,发现这个递推关系很像斐波那契数列. http://paste.ubuntu.com/2340 ...

  3. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

  4. treeview递归加载

    实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  5. Effective Objective-C 2.0 学习记录

    由于最近入职,公司安排自由学习,于是有时间将Effective Objective-C 2.0一书学习了一遍.由于个人知识面较窄,对于书中有些内容无法理解透彻,现将所学所理解内容做一遍梳理,将个人认为 ...

  6. mac 激活Ultra Edit16

    一.文本编辑器UltraEdit 参照Ultra Edit16.10 Mac 破解下载,或者官方下载 Ultra Edit16即可 printf of=/Applications/UltraEdit. ...

  7. ~是什么意思 在C语言中,~0代表什么

    是c语言中的位运算符:取反.0在内存中的存储方式是所有位为0,0000000000000000那么按位取反后位16个1(如果整形在你的机器上站16位),那么表示的数为-1.

  8. IntelliJ IDEA 设置代码提示或自动补全的快捷键

    IntelliJ IDEA 设置代码提示或自动补全的快捷键   点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的 ...

  9. Linux 系统目录结构

    登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot ...

  10. setInterval和setTimeout的区别

    setInterval会每隔指定的毫秒数后反复执行指定代码. setTimeout只会在指定的毫秒数后执行一次指定代码. setInterval的用法: // 创建(创建后即开始计时) var int ...