collections模块

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

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

2、deque: 双端队列,可以快速的从头或尾追加和删除元素。

3、Counter: 计数器,主要用来计数。

4、OrderedDict: 有序字典。

5、defaultdict: 带有默认值的字典。

namedtuple:命名元组

我们知道元组是不可被修改的容器,如元组(10,2),单从这个元组的元素来看,我们不知道这个元组的元素到底表示的是什么。它可以表示一对普通数字,亦可以表示一个坐标轴的两个坐标,还可以表示10的2次幂等,为了解决这个问题namedtuple应运而生。下面是基础示例:

我们假设(10,2)是一个坐标:from collections import namedtuple

# 创建命名元组对象命名,并指定元组长度

point = namedtuple("point",["x","y"])

# 创建命名元组

tuple_1 = point(10,2)

# 以x,y的形式打印元素

print(tuple_1.x,tuple_1.y)

打印内容如下10 2

下面以计算长方体体积为例:from collections import namedtuple

# 创建命名元组对象命名,并指定元组长度

Cuboid = namedtuple("Cuboid",["len","width","height"])

# 创建命名元组

tuple_1 = Cuboid(10,8,6)

# 对比两种打印方式我们就可以看出

# 第一种明显比第二种打印方式更容易理解

print(tuple_1.len * tuple_1.width * tuple_1.height)

print(tuple_1[0] * tuple_1[1] * tuple_1[2])

打印内容如下480

480

由上面的示例可以知道有时候利用命名元组引用元素的时候,我们可以更容易理解元素所表示的是什么。这样对代码的理解会更好。

deque:双端队列

deque与列表类似都是线性存储,但是队列只支持在队列的头部和尾部追加和删除元素,属于列表的特殊版。在插入元素和删除元素的效率上比列表更快。因为列表不仅可以在头部和尾部追加和删除元素,还可以在任意位置追加和删除元素。每当列表删除一个非头部和尾部元素的时候,列表就要重新进行排序以保证列表的线性存储。如下图所示:

由上图我们知道元素30对应的内存地址是3,删除元素30后,为保证列表的线性,元素40和元素50内存地址都向前移了一位,元素40的内存地址由原来的4变成3,元素50的内存地址由原来的5变成4。如果把列表的第一个元素删除了,后面的整个列表都会依次向前补齐位置。而双端队列不会,无论是删除队列的头还是尾队列的整体不会进行补位的操作。from collections import deque

deque_list = deque([1,2,3,4])

deque_list.appendleft("a") # 向头部追加元素

deque_list.append("z") # 向尾部追加元素

print("追加后的数据是:",deque_list)

deque_list.pop() # 删除尾部元素

deque_list.popleft() # 删除头部元素

print("删除后的数据是:",deque_list)

打印内容如下追加后的数据是: deque(['a', 1, 2, 3, 4, 'z'])

删除后的数据是: deque([1, 2, 3, 4])

OrderedDict:有序字典,有序字典是按照键插入顺序进行排列的(Python3.X的字典是按着键插入顺序进行排序的,Python2.X的字典键是按照ASCII表的顺序进行排序。)

如下:Python2.7中进行测试。dict_1 = {}

dict_1["z"] = 1

dict_1["c"] = 3

dict_1["a"] = 2

dict_od = OrderedDict() # 有序字典

dict_od["z"] = 1

dict_od["c"] = 3

dict_od["a"] = 2

print(dict_1)

print(dict_od) # 打印有序字典

打印内容如下{'a': 2, 'c': 3, 'z': 1}

OrderedDict([('z', 1), ('c', 3), ('a', 2)])

defaultdict:默认字典,我感觉这个还是有些用的。

1、如果默认字典的键不存在,不会报错。

2、在定义默认字典时可以指定值的类型。

示例:将列表中大于3的元素保存到字典的“a”键中,将小于3的元素保存到字典的“b”键中。

如下:使用普通字典的方法。list_1 = [1,2,3,4,5,6]

dict_1 = {}

for i in list_1:

if i > 3:

if "a" in dict_1:

dict_1["a"].append(i)

else:

dict_1["a"] = [i]

else:

if "b" in dict_1:

dict_1["b"].append(i)

else:

dict_1["b"] = [i]

print(dict_1)

打印内容如下{'b': [1, 2, 3], 'a': [4, 5, 6]}

如下:使用默认字典的方法。from collections import defaultdict

list_1 = [1,2,3,4,5,6]

dict_d = defaultdict(list) # 定义默认字典

for i in list_1:

if i > 3:

dict_d["a"].append(i)

else:

dict_d["b"].append(i)

print(dict_d)

# 打印内容如下

defaultdict(, {'b': [1, 2, 3], 'a': [4, 5, 6]})

对比两个代码段可以发现使用默认字典的方式代码更加简洁,结构更加清晰明了。

Counter:统计可迭代对象中每个元素出现的次数。from collections import Counter

list_1 = ["a","b","a",1,2,3,1]

print(Counter(list_1))

# 打印内容如下

Counter({'a': 2, 1: 2, 'b': 1, 2: 1, 3: 1})

python内置模块_三分钟读懂Python内置模块collections相关推荐

  1. python 闭包_一篇文章读懂Python的闭包与装饰器!

    什么是装饰器? 装饰器(Decorator)相对简单,咱们先介绍它:"装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数", ...

  2. 读懂python语言_一文读懂python反射机制

    反射 反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性.方法.导入模块,是一种基于字符串的事件驱动.解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译 ...

  3. python高阶函数(三分钟读懂)

    python高阶函数(三分钟读懂) 函数式编程 Python中,函数是一等对象 一等对象:具有特点 ① 对象是在运行时创建的 ② 能赋值给变量或作为数据结构中的元素 ③ 能作为参数传递 ④ 能作为返回 ...

  4. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  5. python和java一样吗-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  6. python和java的区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  7. 三分钟读懂新一代人工智能——ChatGPT

    2022年以来,AI开始在很多贴近消费者的领域发挥越来越大的作用,之前我写过一篇文章<一分钟学会AI绘画和创作>,很多朋友纷纷尝鲜. 最近一个月以来,OpenAI公司推出的智能机器人Cha ...

  8. python输入什么就输出什么_一文读懂Python的输入和输出

    本文介绍了Python的输入和输出,既然是Python代码,那么就一定有输出量,那么,Python是如何输出的呢? 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'h ...

  9. python读取枚举_一文读懂Python 枚举

    enum是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性.我们可以使用 enum 创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护. 创建枚举 我 ...

最新文章

  1. js 的数值限制可能引起的问题
  2. 自定义控件:侧拉删除
  3. 中兴智能视觉大数据:人脸识别技术目前处于“用的不够,用的不好”
  4. java if和else if的区别_关于C语言中if,elseif和else的区别在哪里
  5. MAGENTO与性能优化
  6. Spark 自己实现分箱逻辑遇到的坑
  7. 关于简历:怎样才叫熟悉/精通Linux?
  8. paip.SVN无法提交--提示冲突的解决
  9. acpi_hardware_id可以通过HID/CLD/UID/CLS/method/path获得
  10. python毕业设计项目源码选题(19)篮球、足球、羽毛球等运动场地预约系统毕业设计毕设作品开题报告开题答辩PPT
  11. PAT甲级真题1097 链表重复数据删除(简单解法)
  12. 学计算机应该买多大尺寸笔记本电脑,笔记本电脑买几寸的比较合适?
  13. 神马不是浮云,有未来就能改变世界
  14. 【洛谷 P5149】 会议座位【归并排序】
  15. LaTeX插入多张图片
  16. java向飞秋发文件_飞秋如何发文件夹
  17. 使用电脑修改apk图标和名字
  18. 传智播客开课的第四天
  19. 刷脸支付应用广泛,万亿市场等你并驱争先
  20. Ubuntu 18.04 其他镜像的刻录

热门文章

  1. 最大堆MaxHeap和最小堆MinHeap的实现(转)
  2. 神经网络中快速傅立叶变换(FFT)的梯度传递
  3. 微信支付服务器验证的java_Java中的微信支付(3):API V3对微信服务器响应进行签名验证...
  4. vue锚链接可以从指定位置显示么_onenote链接系列⑥:链接笔记如何产生?与插入链接的区别...
  5. 一步一步写算法(之字符串查找 上篇)
  6. 一步一步写算法(之排序二叉树)
  7. 程序员入门c语言还是java,先学java还是c语言?入门学哪种语言?
  8. python document_python-docx 常用方法
  9. python tk combobox设置值为空_Python编程从入门到实践日记Day24
  10. oracle怎么按时间查找,JDBC:我如何在Oracle中按时间查询?