collections模块基本介绍

xiaoxiao2021-02-28  95

大家都知道python有一些内置的数据类型,比如str, int, tuple, dict, list等。

collections模块在这些基础上,提供了几个额外的数据类型: 1.namedtuple() 生成可以使用名字来访问元素内容的tuple子类(还可用于判断类型) 2.deque(): 双端队列(list长度过长时推荐使用),还可以限定队列长度,适合队列和栈操纵。 3.Counter: 计数器 4.OrderDict: 有序字典 5.defaultDict: 带有默认值的字典

namedtuple() namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可读性,来可以用来做验证。 例如,一个点的二维坐标就可以表示成: >>> p = (1, 2)

取值的时候只能通过下标的方式。 定义class又小题大做,这时候namedtuple就派上用场了

>>> from collections import namedtuple >>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p.x 1 >>> p.y 2 >>> isinstance(p, Point) True >>> isinstance(p, tuple) True # 设置一个圆,x坐标, y坐标,r半径 >>>Circle = namedtuple('Circle', ['x', 'y', 'r'])

2.deque() 双端队列 使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。 list对象的insert和pop操作的时间复杂度是 O(n) ,也就是说随着元素数量的增加耗时呈 线性上升。而使用deque对象则是 O(1) 的复杂度,所以当你的代码有这样的需求的时候, 一定要记得使用deque 作为一个双端队列,deque还提供了一些其他的好用方法,比如 rotate 等

# -*- coding: utf-8 -*- """ 下面这个是一个有趣的例子,主要使用了deque的rotate方法来实现了一个无限循环 的加载动画 """ import sys import time from collections import deque fancy_loading = deque('>--------------------') while True: print '\r%s' % ''.join(fancy_loading), fancy_loading.rotate(1) sys.stdout.flush() time.sleep(0.08) # Result: # 一个无尽循环的跑马灯

双端队列还可以设置一个最大长度maxlen, 实现先进先出(FIFO)

>>> a = deque(maxlen=3) >>> a deque([], maxlen=3) >>> a.append(1) >>> a.append(2) >>> a.append(3) >>> a deque([1, 2, 3], maxlen=3) >>> a.append(4) >>> a deque([2, 3, 4], maxlen=3)
转载请注明原文地址: https://www.6miu.com/read-49961.html

最新回复(0)