python collections模块_Python 的collections模块

前言:

collections是实现了特定目标的容器,以提供python标准内建容器dict,list,set和tuple的替代选择。

Counter

Counter是一个dict子类,主要是用来对你访问的对象的频率进行计数

import collections

#统计字符出现的次数

test1 = collections.Counter('hello world')

#统计单词出现的次数

test2 = collections.Counter('hello world'.split())

print(test1)

'''Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})'''

print(test2)

'''Counter({'hello': 1, 'world': 1})'''

常用方法:

elements():返回一个迭代器,每个元素重复计算的个数,如果一个元素的计数小于1,就会被忽略

most_commen([n]):返回一个列表,提供n个访问频率最高的元素和计数

subtract([iterable-or-mapping]):从迭代对象中减去元素,输入输出可以是0或者是负数

update([iterable-or-mapping]):从迭代对象计数元素或者从另一个映射对象/计数器添加

import collections

a = collections.Counter('hello world'.split())

print(a)

#获取指定对象的访问次数,也可以用get获取

print(a.get('hello'))

print(a['hello'])

#查看元素

print(list(a.elements()))

b = collections.Counter('你好 世界'.split())

#追加对象,也可以使用a.update(b)

print(a+b)

#减少对象,也可以使用a.subtract(b)

print(a-b)

#清除

print(a.clear())

defaultdict

返回一个新的类似字典的对象,defaultdict是内置dict类的子类

defaultdict一个经典用法是使用其中一种内置类型(dict,int,list或str等)作为默认工厂,这些内置类型在没有参数调用时返回空类型

import collections

#使用str

a = collections.defaultdict(str)

print(a)

'''defaultdict(, {})'''

print(a['hello'])

''' '''

print(a)

'''defaultdict(, {'hello': ''})'''

#使用int

fruit = collections.defaultdict(int)

fruit['apple'] = 2

print(fruit)

'''defaultdict(, {'apple': 2})'''

#没有对象时返回0

print(fruit['banana'])

'''0'''

#使用list

b = [('yellow',1),('red',2),('green',3)]

c = collections.defaultdict(list)

for k,v in b:

c[k].append(v)

print(c)

'''defaultdict(, {'yellow': [1], 'red': [2], 'green': [3]})'''

print(c.items())

'''dict_items([('yellow', [1]), ('red', [2]), ('green', [3])])'''

#使用dict

d = collections.defaultdict(dict)

d[1] = {'one',1}

print(d)

'''defaultdict(, {1: {1, 'one'}})'''

#使用set

phone = collections.defaultdict(set)

phone['品牌'].add('小米')

phone['品牌'].add('苹果')

phone['处理器'].add('联发科')

print(phone)

'''defaultdict(, {'品牌': {'苹果', '小米'}, '处理器': {'联发科'}})'''

OrderdDict

Python字典中的键的顺序是任意的,它们不收添加的顺序的控制

colletions.OrderdDict类提供了保留他们添加顺序的字典对象

import collections

ot = collections.OrderedDict()

ot['k1'] = ''

ot['k3'] = ''

ot['k2'] = ''

print(ot)

'''OrderedDict([('k1', ''), ('k3', ''), ('k2', '')])'''

#如果在已经存在的key上添加新的值,将会保留原来的key的值,然后覆盖value值

ot['k1'] = 666

print(ot)

'''OrderedDict([('k1', 666), ('k3', ''), ('k2', '')])'''

print(dict(ot))

'''{'k1': 666, 'k3': '', 'k2': ''}'''

namedtuple

三种定义命名元组的方法,第一个参数是命名元组的构造器(如下所示:Person1,Person2,Person3)

import collections

p1 = collections.namedtuple('Person1',['name','sex','age'])

p2 = collections.namedtuple('Person2','name,sex,age')

p3 = collections.namedtuple('Person3','name sex age')

#实例化命名元组

zhangsan = p1('张三','男',28)

print(zhangsan)

'''Person1(name='张三', sex='男', age=28)'''

lisi = p2('李四','女',24)

print(lisi)

'''Person2(name='李四', sex='女', age=24)'''

print(lisi.name)

'''李四'''

deque

collections.deque返回一个双向队列对象,从左到右初始化(append()),从iterable(迭代对象)数据创建。如果iterable没有指定,新队列为空;

collections.deque队列支持线程安全,对于从两端添加append()或者弹出pop,复杂度都是O(1);

如果长度没有指定或者是None,deque可以增长到任意长度。否则,deque就限定到指定最大长度。一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出;

支持的方法:

append(x):添加x到右端

appendleft(x):添加x到左端

clear():清除所有元素,长度变为0

copy():创建一份浅拷贝

count(x):计算队列中个数等于x的元素

extend(iterable):在队列右侧添加iterable中的元素

extendleft(iterable):在队列左侧添加iterable中的元素【iterable参数的顺序会反过来添加】

index(x[,start[,stop]]):返回第x个元素【从start开始计算,stop之前】。返回第一个匹配,如果没找到,跑出ValueError异常错误

insert(i,x):在 i 位置插入x,【如果插入会导致一个限定deque超出最大长度的话,就抛出InderErrory异常错误】

pop():移除最右侧的元素

popleft():移除最左侧的元素

remove(value):移去找到的第一个value,没有抛出ValueError异常错误

reverse():将deque逆序排列。返回None

maxlen():队列的最大长度,没有限定则为None

import collections

x = collections.deque(maxlen=10)

print(x)

'''deque([], maxlen=10)'''

x.extend('Python')

print(x)

'''deque(['P', 'y', 't', 'h', 'o', 'n'], maxlen=10)'''

x.append('a')

x.appendleft('H')

x.appendleft('P')

x.appendleft('P')

print(x)

'''deque(['P', 'P', 'H', 'P', 'y', 't', 'h', 'o', 'n', 'a'], maxlen=10)'''

x.appendleft('P')

print(x)

'''deque(['P', 'P', 'P', 'H', 'P', 'y', 't', 'h', 'o', 'n'], maxlen=10)'''

ChainMap

我们有多个字典或者映射,想把他们合并成为一个单独的映射,有人说是可以用update进行合并,这样做的问题就是新建了一个数据结构以致于当我们对原来的字典更改的时候不会同步。如果想建立一个同步的查询方法,可以使用ChainMap。可以用来合并两个或者多个字典。当查询的时候,从前往后依次查询,简单使用。

import collections

test1 = {'apple':1,'banana':2}

test2 = {'orange':2,'apple':3,'pike':1}

comb1 = collections.ChainMap(test1,test2)

comb2 = collections.ChainMap(test2,test1)

print(comb1)

'''ChainMap({'apple': 1, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1})'''

print(comb2)

'''ChainMap({'orange': 2, 'apple': 3, 'pike': 1}, {'apple': 1, 'banana': 2})'''

for k,v in comb1.items():

print(k,v)

'''

orange 2

apple 1

pike 1

banana 2

'''

#当ChainMap进行修改的时候总是只会对第一个字典进行修改,如果第一个字典不存在该键,会添加

print(comb1['apple'])

'''1'''

comb1['apple'] = 2

print(comb1)

'''ChainMap({'apple': 2, 'banana': 2}, {'orange': 2, 'apple': 3, 'pike': 1})'''

print(comb1['pike'])

'''1'''

comb1['pike'] = 3

print(comb1)

'''ChainMap({'apple': 2, 'banana': 2, 'pike': 3}, {'orange': 2, 'apple': 3, 'pike': 1})'''

从原理上讲,ChainMap实际上是把放入的字典存储在一个队列里,当进行字典的增删等操作只会在第一个字典中进行。当进行查询的时候会依次查找,new_child()方法实质上是在列表的第一个元素前放入一个字典,默认是{},而parents是去掉列表开头的元素

import collections

a = collections.ChainMap()

a['x'] = 1

print(a)

'''ChainMap({'x': 1})'''

b = a.new_child()

print(b)

'''ChainMap({}, {'x': 1})'''

b['x'] = 2

print(b)

'''ChainMap({'x': 2}, {'x': 1})'''

c = a.new_child()

c['y'] = 2

print(c)

'''ChainMap({'y': 2}, {'x': 1})'''

d = c.parents

print(d)

'''ChainMap({'x': 1})'''

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

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

相关文章

C# VS2017 winForm 使tableLayoutPanel 不闪烁

//设置tablelayoutpanel控件的DoubleBuffered 属性为true,这样可以减少或消除由于不断重绘所显示图面的某些部分而导致的闪烁 private void Form_PrintPreview_Load(object sender, EventArgs e){//开启双缓冲,改善TableLayoutPanel闪烁问题TableLayoutP…

java 继承调用_【JAVA学习】继承中函数调用机制

类(类的对象)在调用函数时,究竟哪一个函数被调用,是存在特定的机制的,现在我们来梳理下其步骤。步骤一:当其调用一个函数的时候,编译器根据其声明的变量类型和调用的函数名字找到所有此“类”和其父类中具有同名的函数…

golang 反射

参考:|--http://blog.51cto.com/speakingbaicai/1707637 |--https://studygolang.com/articles/6324 反射是在golang程序运行时检查变量所具有类型的一种机制。由于反射可以得出关于变量结构的数据(即“关于数据的数据”),所以这也…

java硬件编程_关于JAVA并发编程你需要知道的——硬件篇

无论程序语言如何千变万化,他们都深深地根植于目前的计算机体系结构。左图是intel CPU的三级高速缓存设计,由于高速缓存对程序员基本不可见,因此可以抽象为右图。缓存的设计首先还是先谈谈左图。L1-cache分为两部分,i-cache存储指…

ELF 动态链接 so的动态符号表(.dynsym)

静态链接中有一个专门的段叫符号表 -- “.symtab”(Symbol Table), 里面保存了所有关于该目标文件的符号的定义和引用。 动态链接中同样有一个段叫 动态符号表 -- “.dynsym”(Dynamic Symbol) , 但.dynsym 相对于 .symtab 只保存了与动态链接相关的导入…

java线程池怎么创建_java中的线程池,如何创建?

Java中的线程池它是线程的容器,或者(换句话说,它是具有执行任务能力的线程的集合)。我们可以使用ThreadPool框架来定位(或实现)线程池。线程池可以包含多个线程。每当我们执行任何任务时,线程就会从线程池中出来并完成该任务,然后…

JAVA 基础3-数组

一.数组的概念 数组可以看成是多个数据类型的集合,是对这些数据进行统一的管理; 数组的变量是引用类型,数组本身是对象,数组中的每个元素相当于该对象的成员变量; 数组的元素可以是任何数据类型,包括基础数…

net Core做一个webApi的简单实例

用NetCore 和Dapper 和mySql做一个简单的实例, 一准备工作 1:VS2017windos系统,也可以用其他的操作系统和工具 2:一台Cenetos的虚拟机或者虚拟机 二:开始 1:用微软官方的netCore的ToDo项目改造,…

mysql binlog sql统计_mysql的binlog详解

binlog是mysql记录操作的二进制日志文件,有三种格式可选,但是老旧的SBR已经不适合现在大多数业务需求,所以大多数都建议用MBR和RBR,即mixed或row,而解析他的原因,几乎都只有一个,就是恢复数据库,或者是反编译来恢复数据库,目的都是一样.以下是基于mysql5.6的mysqlbinlog来描述的…

Android项目实战(二十二):启动另一个APP or 重启本APP

Android项目实战(二十二):启动另一个APP or 重启本APP 原文:Android项目实战(二十二):启动另一个APP or 重启本APP一、启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP&#xff0c…

mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...

最近做一个项目,需要对人口数据进行查询,但是人口数据分布在不同的街道表中,首先进行了数据表结构的统一,每个数据表以街道名开头,然后其他的名字都一样前期将各个表中的字段也进行了统一抽象出一张字典表将街道编号和…

oracle批量update

我个人觉得写的很好 http://blog.csdn.net/wanglilin/article/details/7200201 需求: 将t2(t_statbuf)表中id和t1(T_Mt)表相同的记录更新进t1表。 1.错误的写法: 1 update table_name t1 set (a,b,c)( select a,b,c from table_name_2 t2 where t1.at2.a…

java 文件输出流_Java 文件输出流

Java IO教程 - Java文件输出流创建输出流要写入文件,我们需要创建一个FileOutputStream类的对象,它将表示输出流。// Create a file output streamString destFile "test.txt";FileOutputStream fos new FileOutputStream(destFile);当写入文…

Docker自动补全容器名

Zsh Place the completion script in your /path/to/zsh/completion (typically ~/.zsh/completion/): 下载自动完成文件mkdir -p ~/.zsh/completion curl -L https://raw.githubusercontent.com/docker/compose/1.21.0/contrib/completion/zsh/_docker-compose > ~/.zsh/co…

java 打印 模板_Java输入输出模板

常规输入输出绝壁有毒~import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigDecimal;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(St…

MySQL5.7参数log_timestamps

最近测试MySQL 5.7.21 Community Server这个版本的MySQL数据库时,发现其错误日志的时间跟系统当前时间不一致,后面检查发现日期时间格式都是UTC时间,查了一下相关资料,原来在MySQL 5.7.2 之后日志文件里面的时间戳从默认的本地系…

java非堆内存_java – 监视JVM的非堆内存使用情况

我们通常处理OutOfMemoryError问题,因为堆或permgen大小配置问题。但是所有的JVM内存不是permgen或者heap。据我所知,它也可以与Threads / Stacks,本地JVM代码相关…但是使用pmap我可以看到进程分配了9.3G这是3.3G堆外内存使用。我不知道什么…

.net core HttpContext(Http上下文)

在.NET Core中,只有Controller才能直接使用 HttpContext ,其他地方需要通过HttpContextAccessor来访问 转载于:https://www.cnblogs.com/87Super/p/8975311.html

Tidb集群加mysql_TiDB - 快速入门,集群搭建

TiDB 是开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 …

一个ssm综合小案例-商品订单管理-第二天

准确来说是第二三天,一时兴起,把这个小项目一鼓作气写完了(较大的bug 均已被我手动捉出并 fix )才来写一篇博客。 接上文 第一天配置继续讲解: 转载于:https://www.cnblogs.com/Frank99/p/8975378.html