python 之 collections 模块简介使用

󰃭 2017-03-16

前言

python 内置的数据类型有 int/str/list/tuple/set/dict,

除此之外, python 的collections 模块又帮我们扩展了一些数据类型和表示形式

以下简介

OrderDict

python 默认的字典存的是hash 结构, 字典的每个键值对之间是没有顺序之分的, 如下

In [8]: user_info = dict([('name', 'tony'), ('age', 26), ('sex', 'man')])

In [9]: print(user_info)
{'sex': 'man', 'name': 'tony', 'age': 26}

collections下的OrderDict提供了对有序字典的支持

In [22]: user_info = OrderedDict([('name', 'tony'), ('age', 26), ('sex', 'man')])

In [23]: print(user_info)
OrderedDict([('name', 'tony'), ('age', 26), ('sex', 'man')])

其他操作方式和普通的字典使用一样

namedtuple

正如这个模块名称, 命名了的元组

其可以为元组的每个元素命名, 实现通过命名的方式访问元组内容

如下

In [8]: resp = namedtuple('resp', ['value', 'error'])

In [9]: r = resp(True, None)

In [10]: r.value
Out[10]: True

In [11]: r.error

In [12]: r = resp(False, 'error happend')

In [13]: r.value
Out[13]: False

In [14]: r.error
Out[14]: 'error happend'

通过namedtuple, 我们可以为固定元素数量的每个元素定义属性名, 并通过这个属性访问元素

如上面我们定义的resp, 用两个元素, 分别表示接口响应的值和错误信息

这样我们就能通过 value 和 error 关键字获得响应结果了, 这样比通过tuple的 数字索引 更直观

这里的格式说明如下

# namedtuple('名称', [attr_name1, attr_name2])
resp = namedtuple('resp', ['value', 'error'])

一般用于需要使用固定数量元素表示的对象定义

比如, 如果要用坐标和半径表示一个圆

Circle = namedtuple('Circle', ['x', 'y', 'r'])

defaultdict

我们使用的字典, 访问没有设置的元素的时候, 会报一个键名不存在的错误

In [15]: user_info = dict([('name', 'tony'), ('age', '20')])

In [16]: user_info
Out[16]: {'age': '20', 'name': 'tony'}

In [17]: user_info['sex']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-17-52667ce26734> in <module>()
----> 1 user_info['sex']

KeyError: 'sex'

In [18]:

通过 defaultdict, 我们可以为键名创建默认的值

n [20]: user_info = defaultdict(lambda: 'man')

In [21]: user_info['name'] = 'tony'

In [22]: user_info['age'] = 20

In [23]: user_info['name']
Out[23]: 'tony'

In [24]: user_info['sex'] #未定义的sex 
Out[24]: 'man'

注意 defaultdict的参数必须是可调用的, 上面的 lambda是一个匿名函数

deque

deque 提供了比原生list 更快速的对元素的操作, 包括了首部添加元素 和 尾部弹出, 以及两边扩展元素, 元素偏移等等

我们来试试

In [124]: users = deque(('tony', 'wang'))

In [125]: users.appendlet('am') # 向首部添加元素

In [127]: users
Out[127]: deque(['am', 'tony', 'wang'])

In [128]: users.append('Yi_Zhi_Yu') # 向尾部添加元素

In [129]: users
Out[129]: deque(['am', 'tony', 'wang', 'Yi_Zhi_Yu'])

In [138]: users = deque(['am', 'tony', 'wang', 'Yi_Zhi_Yu'])

In [139]: users.rotate() # 元素整体向右移动一个位置, 设置参数可以控制移动的偏移量

In [140]: users
Out[140]: deque(['Yi_Zhi_Yu', 'am', 'tony', 'wang'])

In [143]: users.pop() # 弹出尾部元素
Out[143]: 'Yi_Zhi_Yu'

In [144]: users.popleft() # 弹出首部元素
Out[144]: 'am'

总结

以上是几个比较常用的 collection 包下的几个模块, 希望帮到大家