Python入门之collections
collections模块
collections是Python内建的一个集合模块,提供了许多有用的集合类。
1、collections.Counter('string'|list|tuple):计数器功能;可以统计元素个数,以字典形式显示
>>> s 'chengd is good' >>> t (1, 2, 3, 1, 3, 'name', 'name') >>> l ['chengd', 1, 2, 1, 3, 2, 'chengd'] >>> collections.Counter(s) Counter({' ': 2, 'd': 2, 'g': 2, 'o': 2, 'c': 1, 'e': 1, 'n': 1, 's': 1, 'i': 1, 'h': 1}) >>> collections.Counter(t) Counter({'name': 2, 1: 2, 3: 2, 2: 1}) >>> collections.Counter(l) Counter({1: 2, 2: 2, 'chengd': 2, 3: 1})
collections.Counter()对象方法:除字典方法外还有以下2种
- 计数增加;collections.Counter处理后为前提
>>> l ['chengd', 1, 2, 1, 3, 2, 'chengd'] >>> l1 [1, 1, 22, 11, 22] >>> obj = collections.Counter(l) #collections对象 >>> print(obj) Counter({1: 2, 2: 2, 'chengd': 2, 3: 1}) >>> obj.update(l1) >>> print(obj) Counter({1: 4, 2: 2, 22: 2, 'chengd': 2, 3: 1, 11: 1})
-
计数减少;collections.Counter处理后为前提
>>> l ['chengd', 1, 2, 1, 3, 2, 'chengd'] >>> l1 [1, 1, 22, 11, 22] >>> obj = collections.Counter(l) >>> print(obj) Counter({1: 2, 2: 2, 'chengd': 2, 3: 1}) >>> obj.subtract(l1) >>> print(obj) #处理后,不存在元素会记负数 Counter({2: 2, 'chengd': 2, 3: 1, 1: 0, 11: -1, 22: -2})
注:方法可以通过help(),dir()查看
2、collections.OrderedDict():有序字典;
使用dict
时,Key是无序的。在对dict
做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDic
- 创建有序字典:
import collections obj = collections.OrderedDict([('a', 1), ('b', 2), ('c', 3)]) #创建是注意元素顺序,有序字典是安装创建顺序显示 #或者obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3))) ''' 或者 OrderedDict的Key会按照插入的顺序排列,不是Key本身排序 obj = collections.OrderedDict() obj['a'] = '1' obj['b'] = '2' obj['c'] = '3' print(obj) ''' print(obj) #执行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) ''' 原理:通过字典和列表实现 dic = {'k1':'v1','k2':'v2','k3':'v3'...} lis = ['k1','k2','k3'...] for i in lis: print(dic[i]) '''
注:创建有序字典的参数可以是列表/元组但不能为字典,否则依然是无序的
import collections obj = collections.OrderedDict({('a', 1), ('b', 2), ('c', 3)}) print(obj) 执行结果: OrderedDict([('b', 2), ('c', 3), ('a', 1)]) OrderedDict([('b', 2), ('a', 1), ('c', 3)])
- 有序字典只是特殊的字典,会继承字典方法,但会有些不同
- obj.popitem():按照顺序(从后往前)删除并弹出item;字典是随机删除item
import collections obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3))) print(obj) print(obj.popitem()) print(obj) 执行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) ('c', 3) OrderedDict([('a', 1), ('b', 2)])
-
dic.pop('key'):指定key删除并弹出value;通字典一样
import collections obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3))) print(obj) print(obj.pop("b")) print(obj) 执行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 2 OrderedDict([('a', 1), ('c', 3)])
-
dic.move_to_end('key'):移动指定key到最后,字典是无序的所以无此方法
import collections obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3))) print(obj) print(obj.move_to_end("b")) print(obj) 执行结果 OrderedDict([('a', 1), ('b', 2), ('c', 3)]) None OrderedDict([('a', 1), ('c', 3), ('b', 2)])
注:方法可以通过help(),dir()查看
3、collections.defaultdict('type(list|str|func)'[,key=value]) :默认字典;默认字典取不存在key值,会根据指定类函数返回值(list|str|自定义函数等)
import collections def def_dict(): #自己创建函数 return "N/A" def def_func(): dic = collections.defaultdict(def_dict,age = 99) #函数本是,而不是执行函数 dic["name"] = "chengd" dic['k1'] print(dic) def def_list(): dic = collections.defaultdict(list,age = 99) #系统函数list dic["name"] = "chengd" dic['k1'] print(dic) def def_str(): dic = collections.defaultdict(str,age = 99) #系统函数str dic["name"] = "chengd" dic['k1'] print(dic) def_func() def_list() def_str() 执行结果 defaultdict(<function def_dict at 0x0000000000B6F1E0>, {'k1': 'N/A', 'age': 99, 'name': 'chengd'}) defaultdict(<class 'list'>, {'k1': [], 'age': 99, 'name': 'chengd'}) defaultdict(<class 'str'>, {'k1': '', 'age': 99, 'name': 'chengd'})
默认字典遍历数值字符,并统计字符数量
import collections ss = '1111222233334444' dict_int = collections.defaultdict(int) for s in ss: #s值轮训字符串ss dict_int[s] += 1 #int类型可以做运算;dict_int[s]值为int。类似list可以append等操作 print(dict_int) 执行结果: defaultdict(<class 'int'>, {'4': 4, '2': 4, '1': 4, '3': 4})
注:方法可以通过help(),dir()查看
4、collections.namedtuple() 可命名元组
根据namedtuple可以创建一个包含tuple所有功能以及其他功能的类型;常用于二维、三维坐标
import collections MytupleClass = collections.namedtuple('MytupleClass',['x','y','z']) obj = MytupleClass(11,22,33) print(obj.x) print(obj.y) print(obj.z) #可以通过指定值访问元组元素 执行结果: 11 22 33
注:方法可以通过help(),dir()查看
5、collections.deque():双向队列
使用list
存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list
是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
deque是特殊的列表,具有部分列表方法,并具有其独特的方法;通过dir(deque)和dir(list)对比可知
from collections import deque l = [1,2,3,4,5,6] d = deque(l) print(type(d)) #append(value)添加右侧最后方单个元素; d.append(7) print(d) #appendleft(value)添加左侧最前方单个元素; d.appendleft(0) print(d) #pop()删除右侧最后方单个元素 d.pop() print(d) #pop()删除左侧最前方单个元素 d.popleft() print(d) #extend('seq')添加多个元素,seq是序列类型;直接添加多个元素在右侧 d.extend((11,12,13)) print(d) #extendleft('seq')添加多个元素,seq是序列类型;直接添加多个元素在左侧 d.extendleft([101,102,103]) print(d) #把d尾部元素按从后到前顺序插到首部 d.rotate() print(d) 执行结果: <class 'collections.deque'> deque([1, 2, 3, 4, 5, 6, 7]) deque([0, 1, 2, 3, 4, 5, 6, 7]) deque([0, 1, 2, 3, 4, 5, 6]) deque([1, 2, 3, 4, 5, 6]) deque([1, 2, 3, 4, 5, 6, 11, 12, 13]) deque([103, 102, 101, 1, 2, 3, 4, 5, 6, 11, 12, 13])