1. collections模块:是跟python的扩展相关的模块
1.namedtuple :---生成可以根据名字来取元素内容的元组
from collections import namedtuple Point=namedtuple('point',['x','y','z']) #namedtuple 第一个参数 是随便起的名字,后面是一个列表,用来存放属性名,之后就可以根据这个属性来取值 point=Point(1,2,3) point2=Point(4,5,6) print(point.x) print(point.y) print(point.z) print(point2.x) print(point2.y) print(point2.z)
运行结果:
2.deque:双端队列:可以从左边增加元素,也可以从右边增加元素,当然取值的时候也可以从左边开始,也可以从右边开始~
在讲deque双边队列之前先介绍队列queue的概念:
我们知道堆栈:先进后出(杯子模型)
队列(queue):先进先出,FIFO (排队取票)----从一端增加值,从另一端取值,绝对不可以从中间插入
方法:put()----末尾增加元素;
get()-----取出最头部的元素
import queue q=queue.Queue() q.put(100) # 往队列中添加元素 q.put(200) while q.qsize(): # q.qsize()可以查看当前队列的长度 print(q.get()) # q.get()可以从队列中取值,注意先放入的元素先取出
运行结果:
但是当队列中的元素值都已经取完之后,你再q.get() 不会报错,而是一直等着你给它放值(程序会一直停在那)这种现象又叫 阻塞;
deque(双向队列)-----就是可以同时从两边操作,两边都可以往队列中加值,也可以从队列中取值,所以又叫双端队列(而queue只能是一段增加值,另一端取值,所以才会有先进先出的概念)
方法:append()----双向队列的尾部增加元素
appendleft()---双向队列的头部增加元素
pop()-----从双向队列的尾部取值
popleft()-----从双向队列的头部取值
from collections import deque q=deque() q.append(1) # 给双向队列添加元素 q.appendleft(2) # 从双向队列的左边添加元素 q.insert(1,3) # 从中间位置(1索引位置)添加元素 print(q) # 该双向队列的元素[2,3,1] print(q.pop()) # 返回双向队列的最右端值 print(q.popleft()) #返回双向队列的最左端值
运行结果:
其实list在存储元素时按照索引去查找元素,效率是很高的,但是插入和删除操作效率很低,就是因为list是有序存储,插入和删除效率都很慢;
而deque双端队列就是高效实现插入删除操作的双向列表,适用于栈和队列
3.OrderedDict----有序字典
普通字典dict是无序的,取出字典中的键是无序的,如果我们想让字典(中的key)有序,可以使用有序字典OrderedDicy
from collections import OrderedDict d1=dict([('a',1),('b',2),('c',3)]) print(d1) #此时的字典打印出来key就是无序的 d2=OrderedDict([('a',1),('b',2),('c',3)]) print(d2) for key in d2: #此时挨个取有序字典中的key就是有序的~ print(key)
运行结果:
其实字典相比于列表是要占内存的,有序字典相比于字典又要占内存。。。
4. defaultdict---带有默认值的字典
之前普通字典,当你查找字典中不存在的key时是会报错的(keyerror)但是默认字典不会~
d=dict() #普通字典 print(d['k1']) #会报错的
运行结果:
defaultdict带有默认值的字典就不会这样:需要给defaultdict()指定一个callable的类型,表示key对应的值value默认是该类型的
说明:首先这个参数表示的是key对应的value
其次这个参数必须是callable 类型,所以指定一个整数是不可以的!!
from collections import defaultdict d=defaultdict(list) #参数必须是callable类型的,比如这里就是list,代表key对应的默认值value=[] list类型的~ print(d['k'])
运行结果:
a. 当参数不满足 callable时:
from collections import defaultdict d=defaultdict(1) #参数必须是callable类型的,比如这里就是list,代表key对应的默认值value=[] list类型的~ print(d['k'])
运行结果:
b. 或者参数是这样也可以:
from collections import defaultdict d=defaultdict(tuple) #参数必须是callable类型的,比如这里就是list,代表key对应的默认值value=[] list类型的~ print(d['k'])
运行结果:
c. 当然是一个定义的函数也行(函数是callable)
from collections import defaultdict d=defaultdict(lambda:5) #defaultdict()的参数传一个lambda函数也是可以的,该函数也callable lambda函数无参数,之返回一个5 print(d['k']) # 当字典中无key这个键时 会返回默认值5 d['k1']=2 print(d['k1']) # 字典中有k1 就会用自己的value print(d['k3']) # 当字典中无key这个键时 会返回默认值5
运行结果:
d. 之前我们判断一个列表中大于66的值和小于66的值分别存放在字典不同的key中 是这样操作的:
L=[32,45,56,67,78,89] dict={} # 当然可以直接dict={'k1':[],'k2':[]}后面直接append()ok for i in L: if i>66: if 'k1' in dict: dict['k1'].append(i) else: dict['k1']=[i] else: if 'k2' in dict: dict['k2'].append(i) else: dict['k2']=[i] print(dict)
运行结果:
e. 但是有了defaultdict我们就可以设置默认值:
from collections import defaultdict L=[32,45,56,67,78,89] d=defaultdict(list) for i in L: if i>66: d['k1'].append(i) else: d['k2'].append(i) print(d) print(d['k1']) print(d['k2'])
运行结果:
5.Counter---可以统计字符串中各自的数目
from collections import Counter c=Counter('abcddcba,a,c,d,b,d,c,b,a') print(c)
运行结果:
其实collections模块就是跟python的扩展功能相关的,比如:
tuple元组的扩展naedtuple(可以根据名字找元素);
list列表的扩展双向队列deque(两边都可以进行增加元素,也都可以取出元素)
dict 字典的扩展 有序字典OrderedDict 可以让key变得有序;
dict 字典的扩展带有默认值的字典defaultdict 可以给字典中不存在的key设置一个默认值,但是参数必须是callable(比如list 或者 tuple 或者其他带有返回值的函数 lambda也可以~)