python的collections模块详解

news/2024/11/29 8:49:44/

目录

1.namedtuple(‘name’, [list])

2.Counter() 

3.deque()

4.OrderedDict()


前言:

python中内置容器包括list、dict、set、tuple,而python中的collections模块则另引入了五种数据结构,更好地满足编码需求。

collections 是python内部的集合模块,内置以下几种数据类型:

1.namedtuple(‘name’, [list])

tuple是不可变的元组,如定义坐标点(1,2)、(3,4),但很难直接从代码看出这是表示坐标的,为了增加代码的可读性,我们可以用 ** namedtuple() ** 创建自定义的tuple对象,这个对象是tuple 的子类。

如用(x,y)表示一个点:

from  collections import namedtuple #从collections导入数据类型
Point = namedtuple('Point',['x','y'])#自定义tuple类型Point
p = Point(1,3)
print(isinstance(p,Point))#p是Point类型的实例
print(p)#Point(x=1, y=3)
print (p.x)#1
print (p.y)#3
#也可以定义其他类型
Circle = namedtuple('Circle',['x','y','r']) #自定义tuple类型Circle

这样的一个tuple对象有了可被引用的名称 Point,并且可以通过引用对象属性来访问元组元素 。

2.Counter() 

Counter是一个计数器,用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。

#统计字符串中各个字符出现的个数
from collections import Counter
#从可iterable数据类型(list,tuple,dict)创建Counter类型实例#从字符串创建
s = ' programming '
c = Counter(s);
print(c)#Counter({' ': 2, 'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
#默认按键值对从大到小输出
#从字典类型创建
cdict = Counter({'a':4,'b':5})
print (cdict)#output:Counter({'b': 5, 'a': 4})#从键值对创建,a b指的是键值,不能加引号
ckeys = Counter(a=5,b=6)
print(ckeys)#output:Counter({'b': 6, 'a': 5})
print(type(c))#<class 'collections.Counter'>#返回计数器TopN部分
print(c.most_common())#[(' ', 2), ('r', 2), ('g', 2), ('m', 2), ('p', 1), ('o', 1), ('a', 1), ('i', 1), ('n', 1)]
print(c.most_common(5))#返回出现频率最高的五个元素[(' ', 2), ('r', 2), ('g', 2), ('m', 2), ('p', 1)]
#注意到c.most_common()返回类型为list
print(type(c.most_common()))#<class 'list'>
#那么就可以取出现次数最少的几个元素
print(c.most_common()[:-4:-1])#出现次数最少的3个元素[('n', 1), ('i', 1), ('a', 1)]
print(c['m'])#2返回元素出现次数#计数器内容增加 update
c.update('mmm')#参数为字符串类型
print(c['m'])#5
print(c['a'])#1
c2=Counter('aaa')
c.update(c2)#参数为Counter类型
print(c['m'])#5
print(c['a'])#4,增加了了三个'a'
print('=======')#计数器内容减少 subtract
print(c['b'])#访问的键不存在时,输出0,而不会报错.output:0
c.subtract('aab')
print(c['a'])#,减少了两个'a'  output:2
print(c['b'])#output:-1#del 删除键值
print(c)#output:Counter({'m': 5, ' ': 2, 'r': 2, 'g': 2, 'a': 2, 'p': 1, 'o': 1, 'i': 1, 'n': 1, 'b': -1})
del c['a']
print(c)#output:Counter({'m': 5, ' ': 2, 'r': 2, 'g': 2, 'p': 1, 'o': 1, 'i': 1, 'n': 1, 'b': -1}) 没有'a'
print(c['a'])#0#element() 返回迭代器
print(list(c.elements()))#[' ', ' ', 'p', 'r', 'r', 'o', 'g', 'g', 'm', 'm', 'm', 'm', 'm', 'i', 'n'],排列无序,不包括个数小于1的键值#c中的键值转换为list、set、dict类型
print(list(c))#[' ', 'p', 'r', 'o', 'g', 'm', 'i', 'n', 'b']
print(set(c))#{'g', 'b', 'o', 'r', ' ', 'm', 'p', 'i', 'n'}
print(dict(c))#{' ': 2, 'p': 1, 'r': 2, 'o': 1, 'g': 2, 'm': 5, 'i': 1, 'n': 1, 'b': -1}#浅拷贝
d = c.copy()
print(c==d)#True#加减算术操作,没有乘除
a = Counter(a = 4,b = 5)
b = Counter(c= 7,b =3)
print(a+b)#Counter({'b': 8, 'c': 7, 'a': 4})
print(a-b)#Counter({'a': 4, 'b': 2})subtract 只保留正数计数的元素print(a&b)#Counter({'b': 3}) 输出元素交集 min(a,b)
print(a|b)#Counter({'c': 7, 'b': 5, 'a': 4}) 输出元素并集 max(a,b)#求键值技术的和
print(sum(a.values()))#9#重置counter对象
a.clear()
print(a)#Counter(),没有删除
print(b.items())#dict_items([('c', 7), ('b', 3)])

 

深浅拷贝:

3.deque()

在python 中list查找时间复杂度为O(1),但是插入和删除元素时间复杂度为O(n),即耗时会随着数据规模线性增长。
deque增删元素的时间复杂度为O(1)

from collections import deque
q = deque([1,3,4])
q.pop()
print(q)#deque([1, 3])
q.append(9)
print(q)#deque([1, 3, 9])
q.appendleft(4)#从头部添加元素
print(q)#deque([4, 1, 3, 9])
q.popleft()#删除头部元素
print(q)#deque([1, 3, 9])

 4.OrderedDict()

有序字典,认为字典是有序的,按照创建orderdict实例输入的键值对顺序排列,而不是按照key值本身的顺序。

# 普通Dict类型认为字典是无序的,OrderedDict认为字典是有序的,因此对于键值对排列不同的两个字典,OrderDict会认为是不同的
from collections import OrderedDict
print ('Regular dictionary:')
d2={}
d2['a']='A'
d2['b']='B'
d2['c']='C'd3={}
d3['c']='C'
d3['a']='A'
d3['b']='B'print (d2 == d3)#Trueprint ('\nOrderedDict:')
d4=OrderedDict()
d4['a']='A'
d4['b']='B'
d4['c']='C'd5=OrderedDict()
d5['c']='C'
d5['a']='A'
d5['b']='B'print  (d4==d5)#Falseprint ("Regular dictionary")
d={}
d['b']='B'
d['c']='C'
d['a']='A'
for k,v in d.items():print (k,v)#python3中字典dict正常按序输出,从当前情况看,和orderdict没有区别print ("\nOrder dictionary")
d1 = OrderedDict()d1['b'] = 'B'
d1['c'] = 'C'
d1['a'] = 'A'
d1['1'] = '1'
d1['2'] = '2'
for k,v in d1.items():print (k,v)
#b B
# c C
# a A
# 1 1
# 2 2

 


http://www.ppmy.cn/news/39688.html

相关文章

Anaconda详细安装使用

如果想在conda里面删除某个环境&#xff0c;可以使用 conda remove -n name --all 来删除。 其中 conda info --envs 是查看环境&#xff0c;切换环境 activate base 。 Anaconda Anaconda | The Worlds Most Popular Data Science PlatformAnaconda is the birthplace of Pyt…

《Web应用开发》头歌

目录 一、实验一HTML基础 HTML——表单类的标签 第1关&#xff1a;表单元素——文本框 第2关&#xff1a;表单元素——密码框 第3关&#xff1a;表单元素——单选框 第4关&#xff1a;表单元素——多选框 第5关&#xff1a;表单元素——checked属性 第6关&#xff1a;表…

自然语言处理实战项目2-文本关键词抽取和关键词分值评估

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来自然语言处理实战项目2-文本关键词抽取和关键词分值评估。关键词抽取是自然语言处理中的重要任务&#xff0c;也是基础任务。 一、关键词抽取传统方法 1.基于统计的方法&#xff1a; 基于统计的方法是通过对一组文本…

Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa 会提示密钥存放路径&#xff0c;一般存放在默认路径&#xff0c;直接回车即可&#xff0c;中间会提示输入密码&#xff0c;这里需要注…

vue的自定义指令

在开发的过程中&#xff0c;我们虽然使用过很多vue的内置指令&#xff0c;如;v-if、 v-for v-model、v-show 但是没有自己写过一个自定义的指令&#xff0c;因为要做用户的权限操作&#xff0c;就自己写一个v-perssion的指令。 首先我们看一下官方的描述&#xff1a; 自定义…

打造开箱即用的js工具库之xijs更新指南(v1.2.2)

xijs 是一款开箱即用的 js 业务工具库, 聚集于解决业务中遇到的常用的js函数问题, 帮助开发者更高效的进行业务开发.接下来就和大家一起分享一下v1.2.2 版本的更新内容.github: https://github.com/MrXujiang/xijs1. 添加常用判断函数该模块主要由知乎作者 萌萌你萌不萌啊 贡献…

朴素贝叶斯算法

# -*-coding:utf-8-*- """ Author: sunchang Desc: 代码4-7 朴素贝叶斯实现对异常账户检测 """ import numpy as np class NaiveBayesian: def __init__(self, alpha): self.classP dict() self.classP_f…

蓝桥杯真题05

重新排序 问题描述 给定一个数组 A 和一些查询 Li,Ri 求数组中第 Li 至第 Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可以增加多少? 输入格式 输入第一行包含…