python学习笔记 day19 常用模块

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也可以~)

猜你喜欢

转载自www.cnblogs.com/xuanxuanlove/p/9637854.html