Python自建collections模块

本篇将学习python的另一个内建模块collections,更多内容请参考:Python学习指南

collections是Python内建的一个集合模块,提供了许多有用的集合类。

namedtuple

我们知道tuple可以表示不变集合,例如,一个点的二维左边就可以表示成:

>>>p = (1, 2)

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。
定义一个class又小题大做了,这时,nametuple就派上了用场:

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p.x 1 >>>p.y 2

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

可以验证创建的Point对象时tuple的一种子类:

>>>isinstance(p, Point)
True
>>>isinstance(p, tuple)
True

类似的,如果要用坐标和半径表示一个园,也可以用namedtuple定义:

# namedtuple("名称", [属性list])
Circle = namedtuple("Circle", ['x', 'y', 'r'])

deque

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向队列,适合用于队列和栈:

>>>from collections import deque
>>>q = deque(['a', 'b', 'c']) >>>q.append('x') >>>q.appendleft('y') >>>q deque(['y', 'a', 'b', 'c', 'x'])

deque除了实现list的append()pop()外,还支持appendleft()popleft(),这样就可以非常高效地往头部添加或删除元素。

defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:

>>>from collections import defaultdict
>>>dd = defaultdict(lambda:'N/A') >>>dd['key1'] = 'abc' >>>dd['key1'] 'abc' >>>dd['key2'] 'N/A'

注意默认值是调用函数返回的,而函数创建defaultdict对象时传入。

除了在Key不存在时返回默认值,defaultdict的其他行为跟dict是完全一样的。

OrderedDict

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict:

>>>from collections import OrderedDict
>>>d = dict([('a', 1), ('b', 2), ('c', 3)]) >>>d #dict的Key是无序的 {'a':1, 'c':3, 'b':3} >>>od = OrderedDict([('a', 1), ('b', 2), ('c',3)]) >>>od OrderedDict([('a', 1), ('b',2), ('c',3)])

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

>>>od = OrderedDict()
>>>od['z'] = 1
>>>od['y'] = 2 >>>od['x'] = 3 >>>list(od.keys()) #按照插入的Key的顺序返回 ['z', 'y', 'x']

OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict): def __init__(self, capacity): super(LastUpdatedOrderedDict, self).__init__() self._capacity = capacity def __seitem__(self, key, value): containsKey = 1 if key in self else 0 if len(self) - containsKey >= self._capacity: last = self.popitem(last=False) print("remove:",last) if containsKey: del self[key] print("set:",(key, value)) else: print('add:',(key,value)) OrderedDict.__setitem__(self, key, value)

Counter

Counter是一个简单的计数器,例如,统计字符串出现的个数:

>>>from collections import Counter
>>>c = Counter()
>>>for ch in 'programming': c[ch] = c[ch] + 1 >>>c Counter({'g':2, 'm':2, 'r':2, 'a':1, 'i':1, 'o':1, 'n':1, 'p':1})

Counter实际上也是dict的一个子类,上面的结果可以看出,字符g, m, r各出现了两次,其它字符各出现了一次。

小结

collections模块提供了一些有用的集合类,可以根据需要选用。

转载于:https://www.cnblogs.com/moying-wq/p/10134634.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Thymeleaf th:include、th:replace使用

最近做到页面数据展示分页的功能,由于每个模块都需要分页,所以每个页面都需要将分页的页码选择内容重复的写N遍,如下所示: 重复的代码带来的就是CtrlC,CtrlV ,于是了解了一下thymeleaf的fragment加载语法以及th:includ…

(OS X) OpenCV架构x86_64的未定义符号:错误(OpenCV Undefined symbols for architecture x86_64: error)...

原地址:http://www.it1352.com/474798.html 错误提示如下: Undefined symbols for architecture x86_64:"cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:_main in test-41a30e.o"cv::namedWindow(std::__1::basic…

【算法】大根堆

const swap (arr, i, j) > {const tmp arr[i];arr[i] arr[j];arr[j] tmp; } const heapInsert (arr , i) > { // 插入大根堆的插入算法while(arr[i] > arr[Math.floor((i - 1) / 2]) {swap(arr, i, Math.floor((i - 1) / 2);i Math.floor((i - 1) / 2; } } cons…

[CF1082E] Increasing Frequency

Description 给定一个长度为 \(n\) 的数列 \(a\) ,你可以任意选择一个区间 \([l,r]\) ,并给区间每个数加上一个整数 \(k\) ,求这样一次操作之后数列中最多有多少个数等于 \(c\)。 \(n,c,a_i\leq 10^5\) Solution 假设当前选择区间的右端点为 …

Thymeleaf select 使用 和多select 级联选择

1.使用select 并且回绑数据; 页面&#xff1a; 状态&#xff1a; <select name"status" th:field"*{status}" id"idstatus" class"input-select" th:value"*{status}"> <option value"">--请选择-…

Switch语句的参数是什么类型的?

在Java5以前&#xff0c;switch(expr)中&#xff0c;exper只能是byte&#xff0c;short&#xff0c;char&#xff0c;int类型。 从Java5开始&#xff0c;java中引入了枚举类型&#xff0c;即enum类型。 从Java7开始&#xff0c;exper还可以是String类型。 switch关键字对于多数…

【LOJ】#2184. 「SDOI2015」星际战争

题解 直接二分然后建图跑网络流看看是否合法即可 就是源点向每个激光武器连一条二分到的时间激光武器每秒攻击值的边 每个激光武器向能攻击的装甲连一条边 每个装甲向汇点连一条装甲值的边 代码 #include <bits/stdc.h> #define fi first #define se second #define pii …

表达式符号

Thymeleaf对于变量的操作主要有$*#三种方式&#xff1a; 变量表达式&#xff1a; ${…}&#xff0c;是获取容器上下文变量的值.选择变量表达式&#xff1a; *{…}&#xff0c;获取指定的对象中的变量值。如果是单独的对象&#xff0c;则等价于${}。消息表达式&#xff1a; #{……

Java学习的快速入门:10行代码学JQuery

生活在快速发展时代的我们&#xff0c;如果不提速可能稍不留神就被时代淘汰了。快节奏的时代成就了快餐&#xff0c;亦成就了速成教育。尤其是身处互联网行业的我们&#xff0c;更新换代的速度更是迅速&#xff0c;快速掌握一门技术已经成为潮流趋势。怎样才能快速入门学习java…

项目管理

项目先后衔接的各个阶段的全体被称为项目管理流程。项目管理流程对于一个项目能否高效的执行起到事半功倍的效果。接下来我会利用36张的ppt&#xff08;当然了这里我只用部分图片展示要不然就太多图片了&#xff09;&#xff0c;介绍项目管理的整体流程。 1.项目管理的五大过程…

docker——三剑客之Docker Machine

Docker Machine是Docker官方三剑客项目之一&#xff0c;负责使用Docker的第一步&#xff0c;在多种平台上快速安装Docker环境。它支持多种平台&#xff0c;让用户在很短时间内搭建一套Docker主机集群。Machine项目是Docker官方的开源项目&#xff0c;负责实现对Docker主机本身进…

egret:什么是脏矩形

脏矩形是2D图形性能优化一个重要的概念。Egret2.5开始脏矩形完全可以由引擎自动计算&#xff0c;即大名鼎鼎的"自动脏矩形"。 简单说脏矩形&#xff0c;就是画面刷新时&#xff0c;产生变化而需要重绘的舞台局部区域。 什么叫脏&#xff0c;即什么情况下会弄脏&#…

软件项目管理(一)

首先软件项目管理&#xff0c;什么是项目&#xff1f;什么是软件项目&#xff1f; 项目是唯一的&#xff0c;临时的&#xff0c;即在一定的时间内完成。 具体定义&#xff1a;项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力。 项目的特征&#xff1a; …

strace参数

strace参数 strace参数 -c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号. -F 尝试跟踪vfork调…

软件项目管理(二)

根据上次的路线图 从项目初始开始&#xff1a;包括项目确立和生存期 项目确立分成 项目立项、项目招投标、项目授权 项目立项&#xff1a;确定项目的目标、时间、资源、资金&#xff0c;关键在于得到项目发起人的认可 一个软件项目的立项开始于软件项目的启动&#xff0c;只…

centos6.5和centos7.5统一字符集为zh_CN.UTF-8解决系统和MySQL数据库乱码问题

linux的服务器需要做的操作 centos6.5下&#xff1a; 修改默认字符集为 zh_CN.UTF-8&#xff0c;如果没有中文语言包可能需要安装中文语言包支持 [rootmeinv01 ~]# yum groupinstall chinese-support [rootmeinv01 ~]# cat /etc/sysconfig/i18n #<修改此配置文件为如下 L…

软件项目管理(三)

上次讲完了项目初始部分&#xff0c;包括立项、招投标、授权 在进入第二部分&#xff0c;项目计划 前我们要先了解软件的需求以及任务的分解 软件需求管理 软件需求定义&#xff1a;用户对软件功能和性能的要求 软件需求管理过程&#xff1a;需求获取、需求分析、需求规格…

Winform-图片上传

1.界面上拖个.pictureBox(pictureBox1) //上传点击按钮 private void button1_Click(object sender, EventArgs e) { OpenFileDialog fileDialog new OpenFileDialog(); DialogResult result fileDialog.ShowDialog(); if (result DialogResult.OK) { this.pictureBox1.Imag…

moment.js 快捷查询

格式化日期 当前时间&#xff1a;moment().format(YYYY-MM-DD HH:mm:ss); //2014-09-24 23:36:09 今天是星期几&#xff1a;moment().format(d); //3 转换当前时间的Unix时间戳&#xff1a;moment().format(X); 相对时间 20120901相对当前日期是2年前moment("20120901&quo…

My97 DatePicker获取自定义日期的前一天

1.控件&#xff0c;获取第一个input中的时间&#xff0c;再将这个时间的前一天赋值给第二个input <input type"text" class"form-control input-sm" id"recordTime" style"width:145px" οnclick"WdatePicker({onpicked:chang…