collections模块使用方法

collections模块基于Python中内置的dict、list、set和tuple数据类型实现了一些专门的容器,来扩展这些基础类型变量的功能。app

namedtuple函数

原始的tuple只能经过index的方式访问所包含的元素,namedtuple就至关于为tuple和tuple中的元素取了新的名字,操做的时候能够用这些名字直接去访问(这种操做好像跟C里面的struct差很少耶)。这种设置可让咱们定义tuple变量的目的一目了然,因此用好它可让咱们的代码更易于维护。下面来看看具体怎么用吧!ui

# 如今咱们想要定义一个类型专门用于保存坐标
# 构造一个类专门去保存好像有点麻烦
# 这时namedtuple就派上用场啦

# 执行结果在下方
from collections import namedtuple
Posi = namedtuple('Positions', ('x', 'y'))
p = Posi(1, 2)	# 建立对象时记住要用Posi,Positions只是一个标识的名称
print(p)
# Positions(x=1, y=2)
print(p.x, p.y)	# 记住tuple是不可修改的,因此不能给p.x从新赋值
# 1 2

没错,实例化的对象打印出来的就是咱们前面给它定义的名字,元素名称也能够用咱们给的名字来得到。比起老式的tuple,namedtuple简直是太贴心,一眼就能看出来做用了。code

deque对象

deque是一个对list进行功能扩展的方法,说白了就是把list改为了一个双端队列,可用于栈和队列。虽然list对象也支持相似的操做,可是因为线性存储插入和删除元素的时间复杂度是O(n),当数据量很大时效率很低。deque里面有许多操做方法:排序

from collections import deque
que1 = deque([1,2,3,4,5])
que1.append(5)		# 向右添加元素
print(que1)
# deque([1, 2, 3, 4, 5, 5])
que1.appendleft(0)		# 向左添加元素
print(que1)
# deque([0, 1, 2, 3, 4, 5, 5])
que2 = que1.copy()		# 浅拷贝一个deque对象
print(que1,que2)
# deque([0, 1, 2, 3, 4, 5, 5]) deque([0, 1, 2, 3, 4, 5, 5])
que1.clear()	# 清空deque中元素
print(que1)
#deque([])
print(que2.count(5))	# 统计某一个元素的个数
# 2
que2.extend([6,7])		# 从右合并
que2.extendleft([-1,-2])	# 往左扩展时是倒序合并
print(que2)
# deque([-2, -1, 0, 1, 2, 3, 4, 5, 5, 6, 7])
que2.insert(4,1)	# 向指定位置插入元素,前一个参数为位置,后一个为值
print(que2)
# deque([-2, -1, 0, 1, 1, 2, 3, 4, 5, 5, 6, 7])
que2.pop()	# 右弹出值
que2.popleft()	# 坐弹出值
print(que2)
# deque([-1, 0, 1, 1, 2, 3, 4, 5, 5, 6])
que2.remove(1)	# 删除第一个找到的值
print(que2)
# deque([-1, 0, 1, 2, 3, 4, 5, 5, 6])
que2.reverse()
print(que2)		# 将deque对象中的元素倒排
# deque([6, 5, 5, 4, 3, 2, 1, 0, -1])
que2.rotate(2)		# 将右边的N个元素弹出并插入到左边
print(que2)
# deque([0, -1, 6, 5, 5, 4, 3, 2, 1])

ChainMap继承

ChainMap提供了一种能够将多个映射做为一个单元处理的策略。它每每比建立一个新字典而后用update()将原字典合并来的快得多。须要注意的是ChainMap是经过引用的方式来合并全部映射对象中的元素,因此当原映射对象中的元素改变时,合并后对象中的内容也会改变。队列

from collections import ChainMap

attr1 = {'name':'Tom','Age':18}
attr2 = {'gender':'man','addr':'Beijing'}
people = ChainMap(attr1,attr2)	# 合并两个字典
print(people)
# ChainMap({'name': 'Tom', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
print(people['name'])
# Tom
attr1['name'] = 'Micheal'
print(attr1['name'], people['name'])	# 修改原字典中的值,合并后列表中的值也会改变
# Micheal Micheal
people = people.new_child({'country':'America'})	# new_child为ChainMap实例合并新字典
print(people)
# ChainMap({'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
print(people.parents)		# parents属性指定的是父级内容,即实例变化前的内容
# ChainMap({'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})
print(people.parents.parents)		# 父级的父级内容
#ChainMap({'addr': 'Beijing', 'gender': 'man'})
print(people.maps)		# maps属性返回的是将合并后的ChainMap实例拆分并保存为list的结果,是最新的结果
# [{'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'}]
print(people)
# ChainMap({'country': 'America'}, {'name': 'Micheal', 'Age': 18}, {'addr': 'Beijing', 'gender': 'man'})

counterelement

counter提供的是一个方便又快速的计数器,统计出来的计数是用字典保存的,字段保存为key,出现次数保存为value。Counter能够读取任何字段的计数,不存在的字段默认计数为0,value值也能够为负。使用方法以下:rem

from collections import Counter

c1 = Counter('hello world')
print(c1)
# Counter({'l': 3, 'o': 2, ' ': 1, 'e': 1, 'w': 1, 'h': 1, 'd': 1, 'r': 1})
c2 = Counter({'man':4, 'woman':2})
print(c2)
# Counter({'man': 4, 'woman': 2})
c3 = Counter(child=3, young=1,old=2)
print(c3.most_common(2))	# most_common方法会返回计数排名前N的元素
# [('child', 3), ('old', 2)]
print(list(c3.elements()))	# elements方法返回一个迭代器,里面包含全部的key,数量与计数对应
# ['young', 'old', 'old', 'child', 'child', 'child']
c4 = Counter(child=2,young=1,old=1)
c3.subtract(c4)		# subtract方法用于从一个counter中减掉另外一个counter,key相同时对计数作减法
print(c3)
# Counter({'old': 1, 'child': 1, 'young': 0})
c5 = Counter(middle=3)
c4.subtract(c5)
print(c4)
# Counter({'child': 2, 'young': 1, 'old': 1, 'middle': -3})
del c3['child']	# del用于从字典中删除某一个元素,这类操做一样适用于Counter实例
print(c3['child'])
# 0

fruits1 = Counter({'apple':3,'orange':5,'banana':7})
fruits2 = Counter({'orange':2,'apple':1,'pear':4})
print(fruits1 - fruits2)	# Counter实例还可进行加减运算和按位与或
# Counter({'banana': 7, 'orange': 3, 'apple': 2})
print(fruits1 + fruits2)
# Counter({'banana': 7, 'orange': 7, 'pear': 4, 'apple': 4})
print(fruits1 & fruits2)
# Counter({'orange': 2, 'apple': 1})
print(fruits1 | fruits2)
# Counter({'banana': 7, 'orange': 5, 'pear': 4, 'apple': 3})

还须要注意的是,一些对字典的常规操做一样对Counter也有效。可是fromkeys()在这里不能做用于Counter实例,update()在这里是新增Counter而不是代替旧的Counter,这两种方法是例外。

OrderDict

常规的dict是随机存储的,这就致使了咱们对dict进行迭代的时候没法确元素的顺序。OrderDict可以有效的解决这个问题,可是返回的是插入时的顺序,而不是根据key来排序(若是一开始就定义了元素,输出时是随机顺序输出的)。

from collections import OrderedDict
d = OrderedDict(a=1,b=2,c=3)
print(d)
# OrderedDict([('c', 3), ('a', 1), ('b', 2)])
print(d)
# OrderedDict([('c', 3), ('a', 1), ('b', 2)])
d['d'] = 4
print(d)
# OrderedDict([('c', 3), ('a', 1), ('b', 2), ('d', 4)])
print(d)	# 元素按照固定顺序排列
# OrderedDict([('c', 3), ('a', 1), ('b', 2), ('d', 4)])
d = OrderedDict.fromkeys('abbcde')
print(d)
# rderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])
d.move_to_end('b')		# 将指定元素移动到末尾
print(d.keys())
# odict_keys(['a', 'c', 'd', 'e', 'b'])
d.move_to_end('d',last=False)		# 将指定元素移动到头部
print(d.keys())
# odict_keys(['d', 'a', 'c', 'e', 'b'])
d.popitem()		# 移除末尾元素
print(d.keys())
# odict_keys(['d', 'a', 'c', 'e'])
d.popitem(last=False)		# 移除首部元素
print(d.keys())
# dict_keys(['a', 'c', 'e'])

defaultdict

通常的dict,若是试图访不存在的Key则会抛出KeyError错误。若是但愿Key不存在的时候返回一个默认的value值,那么defaultdict就派上用场了。(注意默认值是经过调用函数来带回值)

from collections import defaultdict
dd = defaultdict(lambda : 0)
dd['a'] = 1
print(dd['a'])
# 1
print(dd['b'])
# 0

UserDict

用户自定义字典类,能够继承该类并重写规则。初始化时能够用来拷贝一个字典的数据,而不是简单的引用。

from collections import UserDict
dict = {'a':1,'b':2}
ud = UserDict(dict)
print(dict, ud)
# {'b': 2, 'a': 1} {'b': 2, 'a': 1}
ud['c'] = 3
print(dict, ud)
# {'b': 2, 'a': 1} {'c': 3, 'b': 2, 'a': 1}

UserList

用户自定义列表类,能够继承该类并重写规则。构建一个用户自定义列表,初始化时能够拷贝另一个列表中的内容。

from collections import UserList
li = [1,2,3,4]
l = li
ul = UserList(li)
del li[0]
print(l, li, ul)
# [2, 3, 4] [2, 3, 4] [1, 2, 3, 4]

UserString

用户自定义字符串类,能够继承该类并重写规则。初始化时能够拷贝一个字符串。

from collections import UserString

s = 'hello world!'
us = UserString(s)
print(s, us)
# hello world! hello world!

转载请注明出处,若有不正之处还望矫正,谢谢

相关文章
相关标签/搜索