Python学习之路---collections模块

collections模块:在内置数据类型(dict list set tuple)的基础上,collections模块还提供了额外的数据类型:Counter\deque\defaulidict\namedtuple和OrderedDict等
1、namedtuple:生成可以使用名字来访问元素内容的tupe (常用于坐标、html标签的长宽)
2、deque:双端队列,可以快速的从另一侧追加和推出对象(与单向队列比,单向队列只能一头放,另一头取)
3、Counter:计数器,主要用来计数
4、OrderedDict:有序字典
5、defaultdict:带有默认值的字典

namedtuple
可命名元组,给元组每个元素起一个名字,这样就可以通过名字来访问元组里的元素,增强了可读性;尤其对于坐标,html标签的长宽等,使用名字可读性更强;有点类似于字典了
格式 namedtuple('名称',[属性list])

from collections import namedtuple
# tuple 元组--不可变的数据类型
# namedtuple -- 可命名元组
# 格式:namedtuple('描述名',[列表])
# 需求,描述一个坐标
p = (1,2)
print(p)
point = namedtuple('point',['x','y'])
p = point(1,2)
print(p.x)
print(p.y)
print(p)
# 注意:列表中的元素,你定义了多少个,就要传多少个元素进去,少一个多一个都不行
p1= point(1,2,3)
print(p1)
# 正确操作
point = namedtuple('point',['x','y','z'])
p1 = point(1,2,3)
print(p1)
from collections import namedtuple
point = namedtuple('point',['x','y'])
p = point(1,2)
print(p)
print(p.x)
print(p.y)
# 如果用坐标和半径表示一个圆
aa = namedtuple('bb',['x','y','z'])
a= aa(1,2,3)
print(a)
print(a.x)
print(a.y)
print(a.z)
# 一个实用的例子--答应访问站点对应的用户名和密码
from collections import namedtuple
login_user = [
    ('baidu.com','jerry','123'),
    ('souhu.com','tom','111'),
    ('sina.com','amy','223'),
]
page_info = namedtuple('login_info',['url','username','password'])
for user in login_user:
    msg = page_info(*user)   # 参考*args  *args 用来将参数打包成tuple给函数体调用
    print(msg)

 deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢,因为list是线性存储,数据量大的时候,插入和删除效率很低
deque是为了高效实现插入和删除的操作的双向列表,适合用于队列和栈

# deque -- 双端队列
# 队列--先进先出--queue--FIFO--如排队买票
# 堆栈--先进后出
import queue
q = queue.Queue()  # 创建一个空的队列
q.put([1,2,4])
q.put(5)
q.put(1)
print(q) # 返回一个内存地址,相当于q是一个空管道,你可以往管道里放球,遵循先进先出
print(q.qsize()) # 获取队列的大小,如果为0就表明是空队列
print(q.get())
print(q.get())
print(q.get())
print(q.get())  # 因为只有三个值,第四个值取不到,就一直堵着----阻塞
from collections import deque
l = [1,2,3]
li = deque(l) # 从单端队列 转为 双端队列
print(li)
li.append(4) # 默认从右侧添加
print(li)
li.appendleft(0) # 从左侧添加
print(li)
li.pop() # 默认从右侧开始删除
print(li)
li.popleft() # 从左侧开始删除
print(li)
li.extend([4,5,6]) # 默认从右侧拓展
print(li)
li.extendleft([-3,-2,-1]) # 从左侧拓展
print(li)

OrderedDict
使用字典是,字典的key是无序的,在对字典做迭代时,我们无法确定key的顺序;
如果要保持key的顺序,可以用OrderedDict

创建字典
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)  # 字典的Key是无序的
#创建有序字典
from collections import OrderedDict
dic_d = OrderedDict(d)  # OrderedDict的key是有序的,且key会按照插入的顺序排列,不是key本身来排序。
print(dic_d)

# OrderedDict的key是有序的,且key会按照插入的顺序排列,不是key本身来排序。
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(od.keys())

defaultdict
默认字典,为字典设置一个默认类型;

# 如一下列表[11,22,33,44,55,66,77,88,99],将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key中
# 即 {‘k1’:大于66,‘k2’:小于66}
l = [11,22,33,44,55,66,77,88,99]
d = {}
for i in l:
    if i > 66:
        if 'k1' not in d.keys():
            d.setdefault('k1', [])
            d['k1'].append(i)
        else:
            d['k1'].append(i)
    else:
        if 'k2' not in d.keys():
            d.setdefault('k2', [])
            d['k2'].append(i)
        else:
            d['k2'].append(i)
print(d)
# 使用defaultdict
from collections import defaultdict
dic = defaultdict(list) # 默认所有Value是list,注意:defaultdict(可被调用的数据类型)
for v in l:
    if v>66:
        dic['k1'].append(v)
    else:
        dic['k2'].append(v)
print(dic)

people = [['male', 'winter'], ['female', 'elly'], ['male', 'frank'], ['female', 'emma']]
#将男性女性分开,所有男性放到'male'中,所有女性放放到'female'中
gender_sort = {}

for info in people:
    if info[0] in gender_sort:
        gender_sort[info[0]].append(info[1])
    else:
        gender_sort[info[0]] = [info[1]]

print(gender_sort)
# 使用 defaultdict
gender_sort = defaultdict(list)
for info in people:
    gender_sort[info[0]].append(info[1])

print(gender_sort)

Counter
Counter 类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式储存,其中元素作为Key,其计数作为value。
计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或者muitisets很相似。

from collections import Counter
c = Counter('abcabcabcabcabcabcabcabcabcabc')
print(c)

猜你喜欢

转载自blog.csdn.net/chengyinman0078/article/details/88368122