python常见模块之collections模块

时间:2021-04-10 18:09:13

一、模块简介

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1.namedtuple: 生成可以使用名字来访问元素内容的tuple

2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

3.Counter: 计数器,主要用来计数

4.OrderedDict: 有序字典

5.defaultdict: 带有默认值的字典

二、模块主要功能

1.namedtuple: 生成可以使用名字来访问元素内容的tuple

1 from collections import namedtuple
2 Tup = namedtuple('name','x,y')
3 t1 = Tup(1,2)
4 print(t1)           # name(x=1, y=2)
5 print(t1.x)         # 1
6 print(t1.y)         # 2
 

注意:(queue不是collections模块里的,在deque之前我们先来看一下queue)
queue: 队列,里面可以存着好多值,只能往里面放值或者往外拿出,不能修改不能查看,而且先拿出的一定是最先放进去的

 1 import queue
 2 
 3 q = queue.Queue()
 4 q.put(10)
 5 q.put(5)
 6 q.put(6)
 7 
 8 print(q.get())
 9 print(q.get())
10 print(q.get())


2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

1 from collections import deque
2 q = deque()
3 q.append(1)#从后端插入值
4 q.appendleft(2)#从前面插入值
5 q.insert(1,4) #在指定索引位置插入值
6 q.pop()#从后往前取值
7 q.popleft()#从前面取值

3.OrderedDict: 有序字典

python中常规字典是无序的,每次查看位置都会不一样,而如果需要创建一个有序的字典就要用OrderedDict了。
需要注意的是,OrderedDict虽然有序,但是也不能通过下标索引来找到元素

1 from collections import OrderedDict
2 dic = OrderedDict([('k1',1),('k2',2),('k3',3)])
3 print(dic)  #OrderedDict([('k1', 1), ('k2', 2), ('k3', 3)])
4 print(dic['k2']) #2
5 for i in dic:
6     print(i)
7 # k1
8 # k2
9 # k3

4.defaultdict: 带有默认值的字典

可以为字典指定一个默认值,默认值可以是列表,字典等一切可以被调用的对象

1 from collections import defaultdict
2 dic1 = defaultdict(list) #创建一个字典,每个键所对应的值都是一个列表
3 print(dic1['k1'])
4 dic2 = defaultdict(dict) #创建一个字典,每个键所对应的值都是一个字典
5 print(dic2['k1'])
6 dic3 = defaultdict(lambda:5) #创建一个字典,每个键所对应的值都是5 (不能直接写5,因为括号内是能被调用的)
7 print(dic2['k1'])

三、应用实例

# 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
# 即: {'k1': 大于66 , 'k2': 小于66}

1 from collections import defaultdict
2 l = [11,22,33,44,55,66,77,88,99,90]
3 dic = defaultdict(list)
4 for i in l:
5     if i>66:
6         dic['k1'].append(i)
7     elif i<66:
8         dic['k2'].append(i)
9 print(dic)  #defaultdict(<class 'list'>, {'k1': [77, 88, 99, 90], 'k2': [11, 22, 33, 44, 55]})