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 包下的几个模块, 希望帮到大家