python之collection模块
collections模块
一、总览
在内置数据类型(int、float、complex、dict、list、set、tuple)的基础上,
collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.OrderedDict: 有序字典
4.defaultdict: 带有默认值的字典
5.Counter: 计数器,主要用来计数 二、namedtuple:可命名元组
from collections import namedtuple
time = namedtuple('My_time',['hour','minute','second'])
t1 = time(17,50,30)
print(t1) # My_time(hour=17, minute=50, second=30)
print(t1.hour) #
print(t1.minute) #
print(t1.second) # 可命名元组非常类似一个只有属性没有方法的类,
这个类最大的特点就是一旦实例化不能修改属性的值,
可命名元组不能用索引取值了,只能用属性取值,
['hour','minute','second']是对象属性名,
My_time是类的名字,而time就相当于把一个类赋值给一个变量(变量复用地址而已,实际上还是那个类)。
相当于:
class A:
pass
B = A
a = A()
b = B()
print(type(a))
print(type(b)) # B所有操作跟A都是一样的,因为B是指向A的类的地址 三、deque:双端队列
list的缺点:list在插入元素(insert)的时候是非常慢的,因为你插入一个元素,那么此元素后面的所有元素索引都得改变,
当数据量很大的时候,那么速度就很慢了。
双端队列:可以弥补List的这个缺点
3-1、双端队列:deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
(实际上双端队列等于是一个可以从左或者右新增删除的列表,列表所有的方法,它也全有)
from collections import deque
dq = deque([1,2,3])
dq.append(4)
dq.append(5)
dq.appendleft(6)
print(dq) # deque([6, 1, 2, 3, 4, 5])
print(dq.pop()) #
print(dq.popleft()) # 6
dq.extend("zxcv")
dq.extendleft([6, 7, 8])
dq.insert(1, "zbj")
del dq[2]
dq.clear()
双端队列原理图:
3-2、再了解一下正常的队列
队列是遵循先进先出的原则(单向的),应用场景:抢票系统
import queue
q = queue.Queue() # 队列对象
q.put(1) # 往队列存元素
q.put(2)
q.put('a')
q.put([1,2,3])
print(q.get()) # 1 取元素
print(q.get()) #
print(q.get()) # a 四、OrderedDict:让字典有序
python3.6之前,字典的Key是无序的(3.6之后字典默认有序,无需用次方法,但是很多公司未必都是在用3.6的版本),
在对dict做迭代时,我们无法确定Key的顺序,如果要保持Key的顺序,可以用OrderedDict。
首先说明一下普通字典的创建,可以使用面向对象的方式创建:
dic1 = dict({'a':1,'b':2}) # 括号里面直接写字典
dic2 = dict([('c',3),('d',4)]) # 括号里面写列表,列表每一个元素是二元组,每个元组是字典的键和值
print(dic1) # {'a': 1, 'b': 2}
print(dic2) # {'c': 3, 'd': 4} from collections import OrderedDict
order_dic = OrderedDict([('a',1),('b',2)])
# 也可以这样创建:order_dic = OrderedDict({'a':1,'b':2}) print(order_dic) # OrderedDict([('a', 1), ('b', 2)]) for key in order_dic:
print(key,order_dic[key])
order_dic['c'] = 3
print(order_dic) # OrderedDict([('a', 1), ('b', 2), ('c', 3)]) 五、defaultdict:为字典设置默认值
from collections import defaultdict
dic = defaultdict(list) # 为字典设置默认值为空列表(defaultdict里面的参数必须是可调用的)
# dic = defaultdict(1) # 报错,因为数字 1 不可调用
print(dic['a']) # []
dic['b'].append(2)
print(dic['b']) # [2] # 可与匿名函数结合使用,设置任何默认值
dic = defaultdict(lambda :'none') # lambda返回什么值都可以
print(dic['a']) # none
print(dic) # {'a': 'none'} dic['b'] = 2
print(dic) # {'a': 'none', 'b': 2} 例子:有如下值集合 [11,22,33,44,55,66,77,88,99,90],将所有大于 66 的值保存至字典的第一个key中,
将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
1、用正常的字典做
lst = [11, 22, 33,44,55,66,77,88,99,90]
dic = {} for num in lst:
if num > 66:
if 'k1' not in dic:
dic['k1'] = [num]
else:
dic['k1'].append(num) elif num < 66:
if 'k2' not in dic:
dic['k2'] = [num]
else:
dic['k2'].append(num)
print(dic) 2、使用字典的默认值
from collections import defaultdict
lst = [11, 22, 33,44,55,66,77,88,99,90]
dic = defaultdict(list) for num in lst:
if num > 66:
dic['k1'].append(num)
elif num < 66:
dic['k2'].append(num)
print(dic) 六、Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,
其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。
from collections import Counter
c = Counter('aaasasabssbba')
print(c) # Counter({'a': 6, 's': 4, 'b': 3})
python之collection模块的更多相关文章
- Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)
Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...
- Python collection模块与深浅拷贝
collection模块是对Python的通用内置容器:字典.列表.元组和集合的扩展,它包含一些专业的容器数据类型: Counter(计数器):dict子类,用于计算可哈希性对象的个数. Ordere ...
- python双端队列-collection模块
双端队列(double-ended queue,或者称deque)在需要按照元素增加的顺序来移除元素时非常有用.其中collection模块,包括deque类型. 使用实例:
- python中string模块各属性以及函数的用法
任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串 ...
- day0320 时间模块 collection模块
一. TIME模块 python提供了一个time和calendar模块可以用于格式化日期和时间. 时间间隔一秒为单位. 每个时间戳都以1970年1月1日午夜经过多长时间来表示. 1.时间戳 函数ti ...
- day 20 collection模块 time 模块 os 模块
一.collection模块 1.namedtuple: 生成可以使用名字来访问元素内容的tuple 2.deque: 双端队列,可以快速的从另外一侧追加和推出对象 3.Counter: 计数器,主要 ...
- Python之multiprocessing模块的使用
作用:Python多进程处理模块,解决threading模块不能使用多个CPU内核,避免Python GIL(全局解释器)带来的计算瓶颈. 1.开启多进程的简单示例,处理函数无带参数 #!/usr/b ...
- python学习之模块-模块(五)
5.10 包 5.10.1 包的概念 [官网解释] Packages are a way of structuring Python's module namespace by using " ...
- python之platform模块
python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...
随机推荐
- checkbox在vue中的用法小结
关于checkbox多选框是再常见不过的了,几乎很多地方都会用到,这两天在使用vue框架时需要用到checkbox多选功能,实在着实让我头疼,vue和原生checkbox用法不太一样,之前对于vue插 ...
- opencv3.2.0图像处理之高斯滤波GaussianBlur API函数
/*高斯滤波:GaussianBlur函数 函数原型: void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double s ...
- 卷烟厂生产管理系统基于ASP.NET
VS.Net 2003开发的一个非常老的生产信息管理系统运行10多年依旧稳定,这几天来南昌做维保工作,看到了曾经开发的信息系统.该系统在我眼里老到几点,可却依然在厂里大面积使用,抛开技术上的落后,从新 ...
- 优秀代码摘录片段一:LinkedList中定位index时使用折半思想
在LinkedList有一段小代码,实现的功能是,在链表中间进行插如,所以在插如的过程中会需要找到对应的index位置的node元素: 如果放在平时只为了实现功能而进行遍历查找,很多人会直接使用一个w ...
- [Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件
1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...
- Docker创建JIRA 7.2.4中文破解版
目录 目录 1.介绍 1.1.什么是JIRA? 2.JIRA的官网在哪里? 3.如何下载安装? 4.对JIRA进行配置 4.1.打开浏览器:http://localhost:20012 4.2.JIR ...
- 我现在有个表,里面有100个不同的单词,每个单词对应有大概20个词组,我想通过sql,每个单词随机获取对应的3个词组,请问怎么写可以实现?
闲来无事刷技术论坛,看到一个这样的问题: 我现在有个表,里面有100个不同的单词,每个单词对应有大概20个词组,我想通过sql,每个单词随机获取对应的3个词组,请问怎么写可以实现? 感觉题材很新颖,角 ...
- GitHub下载克隆clone指定的分支tag代码
需求描述: 这边有很多tag分支版本的代码,我想克隆下载指定版本到我服务器上面 例如:我想下载tag:1.4.1的代码 解决方法: 命令:git clone --branch [tags标签] [gi ...
- SQLServer之创建嵌套触发器
嵌套触发器创建规则 当触发器执行启动其他触发器的操作时,DML 和 DDL 触发器都是嵌套触发器. 这些操作都可以启动其他触发器等. DML 触发器和 DDL 触发器最多可以嵌套 32 层. 可以通过 ...
- 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)
[博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...