当前位置:网站首页>Chapter II Module Encyclopedia "collections Module"

Chapter II Module Encyclopedia "collections Module"

2022-08-10 15:36:00 HUAWEI CLOUD

目录

一、collections模块前言

二、namedtuple的使用方法

三、queue(队列)方法

四、deque(双端队列)方法

五、defaultdict 方法

defaultdict 方法详述

知识点拓展之定义字典的冷门方法

六、Counter方法



一、collections模块前言

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

  • 1.namedtuple: 生成可以使用名字来访问元素内容的tuple
  • 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
  • 3.Counter: 计数器,主要用来计数
  • 4.OrderedDict: 有序字典
  • 5.defaultdict: 带有默认值的字典
  • 6.queue:队列(先进来的先出去)

以下就会详细讲解这几个数据类型的基础知识和使用方法

二、namedtuple的使用方法

我们知道tuple可以表示不变的列表,例如,一个点的二维坐标就可以用如下方式表示:

a = (2,3)

但是我们第一眼看到a = (2,3)会想到它是表示坐标吗?我想大多数人会看成是将一个含有2和3元素的元组赋给a这个变量吧!如何让我们第一眼看到就会知道它表示坐标呢?

这时,namedtuple就派上了用场:

from collections import namedtuple#表示二维坐标Point = namedtuple('point',['x','y'])p = Point(1,2)#从二维坐标中取x轴的数值print(p.x)print(p.y)#表示三维坐标Point = namedtuple('point',['x','y','z'])p2 = Point(1,2,3)#从二维坐标中取x轴的数值print(p2.x)print(p2.y)print(p2.z)输出结果:12123

创建扑克牌

Card = namedtuple('card',['suits','number'])#生成一张扑克牌clo = Card('红桃',2)#打印这张扑克牌print(clo)#打印这张扑克牌的花色print(clo.suits)#打印这张扑克牌的大小print(clo.number)输出结果:card(suits='红桃', number=2)红桃2


三、queue(队列)方法

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,能够在多线程中直接使用.可以使用队列来实现线程间的同步.

  1. Queue.put()向队列中放值
  2. Queue.get()从队列中取值
  3. Queue.qsize() 返回队列的大小
  4. Queue.empty() 如果队列为空,返回True,反之False
  5. Queue.full()如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应
  6. Queue.get([block[, timeout]])获取队列,timeout等待时间
  7. Queue.get_nowait() 相当于Queue.get(False),非阻塞方法
  8. Queue.put(item) 写入队列,timeout等待时间
  9. Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号.每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕.
  10. Queue.join() 实际上意味着等到队列为空,再执行别的操作
     

栗子:

#队列import queue#首先创建一个队列q = queue.Queue()#往q队列中依次放值q.put(9)q.put(8)q.put(7)#往队列中依次取值print(q.get())print(q.get())print(q.get())输出结果:987

如果还向q执行q.get()(此时q的值已被取完)向q取值的话程序不会报错但是会发生阻塞


编辑


如果不想出现阻塞,可以在取值之前用Queue.qsize() 看看队列的大小


#队列import queue#首先创建一个队列q = queue.Queue()#往q队列中依次放值,# 放的值可以是任意的数据类型,但是一次只可以放一个值q.put([1,2,3])q.put(8)q.put(7)#打印这个队列print(q)#往队列中依次取值print(q.get())print(q.get())print('还有%d个值可取' % q.qsize())print(q.get())print('还有%d个值可取' % q.qsize())#print(q.get())#Program blocking output results:<queue.Queue object at 0x0000020106C89A30>[1, 2, 3]8还有1个值可取7还有0个值可取


四、deque(双端队列)方法

双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构.

双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行.双端队列可以在队列任意一端入队和出队.
操作:


  1. Deque() 创建一个空的双端队列
  2. append()向双端队列后面放数据
  3. appendleft()向双端队列前面放数据
  4. pop()向双端队列后面取数据
  5. popleft()向双端队列前面取数据
  6. add_front(item) 从队头加入一个item元素
  7. add_rear(item)从队尾加入一个item元素
  8. remove_front() 从队头删除一个item元素
  9. remove_rear()从队尾删除一个item元素
  10. is_empty() 判断双端队列是否为空
  11. size() 返回队列的大小

栗子:

from collections import dequedq = deque([1,2])#向这个队列后端插入‘a’dq.append('a')#向这个队列前端插入‘b’dq.appendleft('b')#双印这个双端队列print('插入数据后的队列',dq)#向第二个位置插入数字3dq.insert(2,3)#取数据print(dq.pop())print(dq.pop())print(dq.popleft())#双印这个双端队列print('取出数据后的队列',dq)输出结果:插入数据后的队列 deque(['b', 1, 2, 'a'])a2b取出数据后的队列 deque([1, 3])

插入数据的流程:


五、defaultdict 方法

  • defaultdict 方法详述

有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典中的k1中,将小于 66 的值保存至k2的值中.

即: {'k1': 大于66 'k2': 小于66}按以前的做法如果要保存至字典的字典中没有k1或k2,就会抛出KeyError.如果希望key不存在时,返回一个默认值,就可以用defaultdict

如何使用defaultdict呢?

defaultdict接受一个工厂函数作为参数,如下来构造:

dict =defaultdict( factory_function)

这个factory_function必须是可以调用的可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0,简单来说defaultdict在我们操作字典中没有的键时,会自动创建而不会报错,且你可以指定自动创建的键对应的值的默认类型,通过改变factory_function

from collections import defaultdictvalues = [11, 22, 33,44,55,66,77,88,99,90]my_dict = defaultdict(list)for value in  values:    if value>66:        my_dict['k1'].append(value)    else:        my_dict['k2'].append(value)输出结果:defaultdict(<class 'list'>, {'k2': [11, 22, 33, 44, 55, 66], 'k1': [77, 88, 99, 90]})
  • 知识点拓展之定义字典的冷门方法

按平常我们会这样定义一个字典d:

d = {'a' : 1,'b' : 2,'c' : 3}

但其实上面这个字典也可以这样定义:

d = dict([('a' :1),('b' : 2),('c' : 3)])

但这两种方法定义的字典的键都是无序的,如果想要得到一个键为有序的字典还是得用defaultdict 方法

六、Counter方法

 方法用到的地方不多,主要是记录字符串中相同值出现的次数

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

from collections import Counterc = Counter('abcdeabcdabcaba')print(c)输出结果:Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})


原网站

版权声明
本文为[HUAWEI CLOUD]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/222/202208101458519306.html