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

1.namedtuple

作用:用于生成一个可以使用名字访问元素内容的tuple

如果要表示一个点,我们可以这样表示,但是在使用时我们很难看出这个tuple是用来表示一个坐标

  1. p = (1,2)

因此我们调用namedtuple来解决这个问题

表示二维中的一个点:

  1. import collections
  2. Point = collections.namedtuple('Point',['x','y'])
  3. print(Point) #<class '__main__.Point'>
  4. p = Point(1,2)
  5. print(p.x) #
  6. print(p.y) #
  7. print(p) #Point(x=1, y=2)

表示三维中的一个点:

  1. import collections
  2. Point = collections.namedtuple('Point',['x','y','z'])
  3. print(Point) #<class '__main__.Point'>
  4. p = Point(1,2,3)
  5. print(p.x) #
  6. print(p.y) #
  7. print(p.z) #
  8. print(p) #Point(x=1, y=2, z=3)

表示一个圆的属性:

  1. import collections
  2. Circle = collections.namedtuple('Circle',['r','d','s','l'])

表示一张扑克牌:

  1. import collections
  2. Card = collections.namedtuple('card',['c_class','c_num'])
  3. c = Card('方块','')
  4. print(c.c_class) #方块
  5. print(c.c_num) #4
  6. print(c) #card(c_class='方块', c_num='4')

2.deque()

这里先说一个队列quque()

队列的特性:先进先出(FIFO)

  1. import queue
  2. i = 1
  3. q = queue.Queue()
  4. q.put(5)
  5. q.put(6)
  6. q.put(-5)
  7. print(q) #<queue.Queue object at 0x0000000002082EB8>
  8. print(q.qsize()) #3 整个队列长度为3
  9. print(q.get()) #
  10. print(q.get()) #
  11. print(q.get()) #-5
  12. print(q.get()) #阻塞 因为整个队列只有3个元素,当3个元素全部取出后就再也取不出新的元素,程序就会一直等待用户给它一个值

deque()双端队列,两边的头都可以取和存

  1. from collections import deque
  2. dq = deque([5,6])
  3. dq.append('a') #从后面放数据
  4. dq.appendleft('b') #从前面放数据
  5. dq.insert(1,'c') #在1这个索引下加入'c',原位置下的元素往后移一位
  6. print(dq) #deque(['b', 'c', 5, 6, 'a'])
  7. print(dq.pop()) #a 向后弹出一个元素'a'
  8. print(dq.popleft()) #b 向前弹出一个元素'b'

运用队列的好处在于能够高效插入和删除操作的双向列表,适合用于队列和栈

而我们使用list,虽然访问元素速度很快但是我们要插入或删除一个元素就会慢很多,数据量大的时候后,插入和删除效率也会很低

3.OrderedDict()

当我们在操作字典时,我们无法确定自己的key的顺序,如果我们要保持这一顺序我们就可以使用有序字典OrderedDict()这一个方法

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

ps:存储一个列表或字典时,字典往往会比列表更占内存

4.defaultdict()

给字典通过一个没有参数的匿名函数设置一个默认值

  1. from collections import defaultdict
  2. d = defaultdict(lambda : 5)
  3. print(d['k']) #
  4. print(d['v']) #
  5. print(d['b']) #
  6. print(d) #defaultdict(<function <lambda> at 0x0000000002158730>, {'k': 5, 'v': 5, 'b': 5})

5.Counter()

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

  1. from collections import Counter
  2. ret = Counter('avbb223')
  3. print(ret) #Counter({'b': 2, '2': 2, 'a': 1, 'v': 1, '3': 1})

Python学习日记(十五) collections模块的更多相关文章

  1. Python学习日记(十八) 序列化模块

    什么是序列? 就是每一个元素被有序的排成一列 什么是序列化? 就是将原本的列表.字典等内容转化成字符串的过程 什么时候会用到序列化? 数据存储(把数据放在文件.数据库),网络传输等 序列化的目的 1. ...

  2. Python学习日记(十六) time模块和random模块

    time模块 python表示时间的三种方式:时间戳.元祖(struct_time).格式化时间字符串 三种格式之间的转换: 1.时间戳 就是从1970年1月1日0点0分0秒开始按秒计算的偏移量,时间 ...

  3. Python 学习 第十五篇:模块搜索路径和包导入

    在导入自定义的模块时,除了指定模块名之外,也需要指定目录,由于Python把目录称作包,因此,这类导入被称为包导入.包导入把计算机上的目录变成Python的命名空间,而目录中所包含的子目录和模块文件则 ...

  4. Python学习(十) —— 常用模块

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

  5. python学习(十二)模块

    怎么一下子就来学了模块? 其实学了判断.循环.函数等知识就可以开始下水写程序了,不用在意其他的细节,等你用到的时候再回过头去看,此所谓囫囵吞枣学习法. 为啥学模块? 有点用的.或者有点规模的程序都是要 ...

  6. python 学习笔记十五 web框架

    python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...

  7. Python学习系列----第五章 模块

    5.1 如何引入模块 在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入.在调用math模块中的函数时,必须这样引用: ...

  8. Python学习日记(十九) 模块导入

    模块导入 当文件夹中有这样一个自定义的command模块 在它的内部写下下列代码: print('这个py文件被调用!') def fuc(): print('这个函数被调用!') 然后我们在comm ...

  9. Python学习日记(十四) 正则表达式和re模块

    正则表达式: 它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量 字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一 ...

随机推荐

  1. C# linq 使用Groupby lamda 获取非重复数据

    ).GroupBy(b => b.BasicUserId).Select(a => new MyServicesListViewModel() { HeadIcon = apiUrl + ...

  2. SQLServer string_split函数,撕裂函数,撕开函数

    declare @name char(1000) --注意:char(10)为10位,要是位数小了会让数据出错 set @name='s{sss}fc{fggh}dghdf{cccs}x' selec ...

  3. odoo开发笔记 -- 跨域Refused to display in a frame because it set 'X-Frame-Options' to 'DENY'

    场景描述: odoo界面嵌入iframe,Refused to display in a frame because it set 'X-Frame-Options' to 'DENY' 跨域请求失败 ...

  4. HTTP和HTTPS概念

    HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...

  5. BackgroundWorkerHelper

    public static class BackgroundWorkerHelper { public static void Run(DoWorkEventHandler doWork, RunWo ...

  6. Puppeteer最大化显示,分辨率自适应

    Puppeteer自适应分辨率,可以将defaultViewport设为null, 启动的时候还是半屏显示,点击最大化按钮,可以最大化显示. 这样分辨率能够自适应操作系统. 具体可看:https:// ...

  7. LeetCode_415. Add Strings

    415. Add Strings Easy Given two non-negative integers num1 and num2 represented as string, return th ...

  8. [LeetCode] 682. Baseball Game 棒球游戏

    You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...

  9. python sys模块(12)

    在python sys模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数!关于sys模块在官网也有详细的介绍:python sys模块官方介绍. 一.sys模块简介 sys.arg ...

  10. Java开发笔记(一百二十九)Swing的输入框

    Swing的输入框仍然分成两类:单行输入框和多行输入框,但与AWT的同类控件相比,它们在若干细节上有所调整.首先说单行输入框,AWT的单行输入框名叫TextField,平时输入什么字符它便显示什么字符 ...