这个模块提供几个非常有用的Python容器类型

1.容器

名称 功能描述
OrderedDict 保持了key插入顺序的dict
namedtuple 生成可以使用名字来访问元素内容的tuple子类
Counter 计数器,主要用来计数
deque 类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
defaultdict dict的子类,带有默认值的字典

2.OrderedDict

  OrderedDict类似于正常的词典,只是它记住了元素插入的顺序,当迭代它时,返回它会根据插入的顺序返回。

  • 和正常字典相比,它是”有序”的(插入的顺序)。
from collections import OrderedDict

dict1 = dict()  # 普通字典
dict1['apple'] = 2
dict1['banana'] = 1
dict1['orange'] = 3 dict2 = OrderedDict() # 有序字典
dict2['apple'] = 2
dict2['banana'] = 1
dict2['orange'] = 3 for key, value in dict1.items():
print 'key:', key, ' value:', value for key, value in dict2.items():
print 'key:', key, ' value:', value
# ----输出结果-----

# 普通字典
key: orange value: 3
key: apple value: 2
key: banana value: 1 # 有序字典
key: apple value: 2
key: banana value: 1
key: orange value: 3
  • 如果重写已经存在的key,原始顺序保持不变,如果删除一个元素再重新插入,那么它会在末尾。
from collections import OrderedDict

dict2 = OrderedDict()
dict2['apple'] = 2
dict2['banana'] = 1
dict2['orange'] = 3 # 直接重写apple的值,顺序不变
dict2['apple'] = 0 # 删除在重新写入banana, 顺序改变
dict2.pop('banana')
dict2['banana'] = 1 print dict2
# ----输出结果-----
OrderedDict([('apple', 0), ('orange', 3), ('banana', 1)])
  • 可以使用排序函数,将普通字典变成OrderedDict。
from collections import OrderedDict

d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
order_d = OrderedDict(sorted(d.items(), key=lambda t: t[1])) for key, value in order_d.items():
print 'key:', key, ' value:', value
# ----输出结果-----
key: pear value: 1
key: orange value: 2
key: banana value: 3
key: apple value: 4

3.namedtuple

  namedtuple就是命名的tuple,一般情况下的tuple是这样的(item1, item2, item3,…),所有的item都只能通过index访问,没有明确的称呼,而namedtuple就是事先把这些item命名,以后可以方便访问。

from collections import namedtuple

# 定义一个namedtuple类型User,并包含name,sex和age属性。
User = namedtuple('User', ['name', 'sex', 'age']) # 创建一个User对象
user1 = User(name='name1', sex='male', age=18) # 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法
user2 = User._make(['name2', 'male', 21]) print 'user1:', user1 # 使用点号获取属性
print 'name:', user1.name, ' sex:', user1.sex, ' age:', user1.age # 将User对象转换成字典,注意要使用"_asdict"
print 'user1._asdict():', user1._asdict() # 字典转换成namedtuple
name_dict = {'name': 'name3', 'sex': 'male', 'age': 20}
print 'dict2namedtuple:', User(**name_dict) # 修改对象属性,注意要使用"_replace"方法
print 'replace:', user1._replace(age=22)
# ----输出结果-----
user1: User(name='name1', sex='male', age=18)
name: name1 sex: male age: 18
user1._asdict(): OrderedDict([('name', 'name1'), ('sex', 'male'), ('age', 18)])
dict2namedtuple: User(name='name3', sex='male', age=20)
replace: User(name='name1', sex='male', age=22)

4.Counter

  Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。

  • Counter创建有如下几种方法
from collections import Counter

print Counter('aabbcccd')  # 从一个可iterable对象(list、tuple、dict、字符串等)创建
print Counter(['a', 'a', 'c']) # 从一个可iterable对象(list、tuple、dict、字符串等)创建
print Counter({'a': 4, 'b': 2}) # 从一个字典对象创建
print Counter(a=4, b=2) # 从一组键值对创建
# ----输出结果-----
Counter({'c': 3, 'a': 2, 'b': 2, 'd': 1})
Counter({'a': 2, 'c': 1})
Counter({'a': 4, 'b': 2})
Counter({'a': 4, 'b': 2})
  • 获取元素的计数时和dict类似, 但是这里的key不存在时返回0,而不是KeyError
>>> c = Counter("acda")
>>> c["a"]
2
>>> c["h"]
0
  • 可以使用update和subtract对计数器进行更新(增加和减少)
from collections import Counter

c = Counter('aaabbc')

print 'c:', c

c.update("abc")
print 'c.update("abc"):', c # 用另一个iterable对象update 也可传入一个Counter对象 c.subtract("abc")
print 'c.subtract("abc"):', c # 用另一个iterable对象subtract 也可传入一个Counter对象
# ----输出结果-----
c: Counter({'a': 3, 'b': 2, 'c': 1})
c.update("abc"): Counter({'a': 4, 'b': 3, 'c': 2})
c.subtract("abc"): Counter({'a': 3, 'b': 2, 'c': 1})
  • 返回计数次数top n的元素
from collections import Counter

c = Counter('aaaabbcccddeeffg')

print c.most_common(3)
# ----输出结果-----
[('a', 4), ('c', 3), ('b', 2)]
  • Counter还支持几个为数不多的数学运算+、-、&、|
from collections import Counter

a = Counter(a=3, b=1)
b = Counter(a=1, b=1) print 'a+b:', a + b # 加法,计数相加
print 'a-b:', a - b # 减法,计数相减
print 'b-a:', b - a # 只保留正计数
print 'a&b:', a & b # 交集
print 'a|b:', a | b # 并集
# ----输出结果-----
a+b: Counter({'a': 4, 'b': 2})
a-b: Counter({'a': 2})
b-a: Counter()
a&b: Counter({'a': 1, 'b': 1})
a|b: Counter({'a': 3, 'b': 1})

5.deque

  deque就是双端队列,是一种具有队列和栈的性质的数据结构,适合于在两端添加和删除,类似与序列的容器

  • 常用方法
from collections import deque

d = deque([])  # 创建一个空的双队列

d.append(item)  # 在d的右边(末尾)添加项目item

d.appendleft(item)  # 从d的左边(开始)添加项目item

d.clear()  # 清空队列,也就是删除d中的所有项目

d.extend(iterable)  # 在d的右边(末尾)添加iterable中的所有项目

d.extendleft(item)  # 在d的左边(开始)添加item中的所有项目

d.pop()  # 删除并返回d中的最后一个(最右边的)项目。如果d为空,则引发IndexError

d.popleft()  # 删除并返回d中的第一个(最左边的)项目。如果d为空,则引发IndexError

d.rotate(n=1)
# 将d向右旋转n步(如果n<0,则向左旋转) d.count(n) # 在队列中统计元素的个数,n表示统计的元素 d.remove(n) # 从队列中删除指定的值 d.reverse() # 翻转队列

6.defaultdict

  使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

  • 比如要统计字符串中每个单词的出现频率
from collections import defaultdict

s = 'ilikepython'

# 使用普通字典
frequencies = {}
for each in s:
frequencies[each] += 1 # 使用普通字典
frequencie = defaultdict(int)
for each in s:
frequencie[each] += 1

  第一段代码中会抛出一个KeyError的异常,而使用defaultdict则不会。defaultdict也可以接受一个函数作为参数来初始化:

>>> from collections import defaultdict
>>> d = defaultdict(lambda : 0)
>>> d['0']
0

Python标准库笔记(4) — collections模块的更多相关文章

  1. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

  2. Python标准库笔记(10) — itertools模块

    itertools 用于更高效地创建迭代器的函数工具. itertools 提供的功能受Clojure,Haskell,APL和SML等函数式编程语言的类似功能的启发.它们的目的是快速有效地使用内存, ...

  3. Python标准库笔记(9) — functools模块

    functools 作用于函数的函数 functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们. 装饰器 partial 类是 functools 模块提供的主要工具, ...

  4. Python标准库笔记(8) — pprint模块

    struct模块提供了用于在字节字符串和Python原生数据类型之间转换函数,比如数字和字符串. Python版本: 2.x & 3.x 该模块作用是完成Python数值和C语言结构体的Pyt ...

  5. Python标准库笔记(6) — struct模块

    该模块作用是完成Python数值和C语言结构体的Python字符串形式间的转换.这可以用于处理存储在文件中或从网络连接中存储的二进制数据,以及其他数据源. 用途: 在Python基本数据类型和二进制数 ...

  6. Python 标准库笔记(1) — String模块

    原文出处: j_hao104 String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大 ...

  7. (转)Python 标准库笔记:string模块

    String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 原文:http://www.10tiao.com/html/384/201709/2651305041/1.htm ...

  8. Python标准库笔记(1) — string模块

    String模块包含大量实用常量和类,以及一些过时的遗留功能,并还可用作字符串操作. 1. 常用方法 常用方法 描述 str.capitalize() 把字符串的首字母大写 str.center(wi ...

  9. Python标准库笔记(3) — datetime模块

    datetime模块提供了简单和复杂的方式用于操纵日期和时间的类.虽然支持日期和时间运算,但实现的重点是为了输出格式化和操作高效地提取属性. 1. 模块内容 内容 描述 常量   datetime.M ...

随机推荐

  1. 面试:谈谈你对Spring框架的理解

    Spring是一个优秀的轻量级框架,大大的提高了项目的开发管理与维护.Spring有两个核心模块.一个是IOC,一个是AOP. IOC: 就是控制反转的意思,指的是我们将对象的控制权从应用代码本身转移 ...

  2. Java中的缓冲流详解

    缓冲流增强了读写文件的能力,比如Student.txt是一个学生的名单,每个姓名占一行.如果我们想要读取名字,那么每次必须读取一行,使用FileReader流很难完成这样的任务,因为我们不清楚一行有多 ...

  3. BZOJ4771 七彩树(dfs序+树上差分+主席树)

    考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...

  4. 【题解】CF#833 B-The Bakery

    一个非常明显的 \(nk\) dp 状态 \(f[i][k]\) 表示以 \(i\) 为第 \(k\) 段的最后一个元素时所能获得的最大代价.转移的时候枚举上一段的最后一个元素 \(j\)更新状态即可 ...

  5. Windows系统中Xshell与Linux连接时遇到的问题

    前提条件:在Windows系统中已经安装了Xshell,并且安装了虚拟机软件和Linux系统 步骤1.在Linux系统中root用户下,使用ifconfig命令查看虚拟系统Linux的IP地址.如图1 ...

  6. 弱校的ACM奋斗史

    这是一篇老文章,不过由于无法找到最初的发文地址,这里就不能粘贴原文网址了.本站转载此文与ACMer们共勉.感谢acmerfight供稿. 题解:还记得2年前的一个晚上,我和一个女孩一起写完了这篇文章. ...

  7. bzoj1483: [HNOI2009]梦幻布丁(链表+启发式合并)

    题目大意:一个序列,两种操作. ①把其中的一种数修改成另一种数 ②询问有多少段不同的数如1 2 2 1为3段(1 / 2 2 / 1). 昨晚的BC的C题和这题很类似,于是现学现写居然过了十分开心. ...

  8. JavaScript对iframe的DOM操作

    在IE6.IE7中,我们可以使用 document.frames[ID].document 来访问iframe子窗口中的document对象,可是这是不符合W3C标准的写法,也是IE下独有的方法,在F ...

  9. [codeforces/edu5]总结(F)

    链接:http://codeforces.com/contest/616 A题: 统一成1e6长度的字符串,右对齐比较字典序. B题: 求所有行的最小值,里面最大的那个.暴力. C题: 先用dfs给每 ...

  10. Hadoop Yarn事件处理框架源码分析

    由于想在项目中使用类似yarn的事件处理机制,就看了实现.主要是由Dispatcher.java,EventHandler.java,Service.java这3个类撑起来的. 在事件处理之前,先注册 ...