python3 collections模块 tree_第30天: Python collections 模块

by 豆豆

1.简介

collections 是 python 的内置模块,提供了很多方便且高性能的关于集合的操作,掌握这些知识有助于提高代码的性能和可读性。

2.常用功能

2.1 namedtuple 功能详解

namedtuple() 返回一个新的元组子类,且规定了元组的元素的个数,同时除了使用下标获取元素之外,还可以通过属性直接获取。

from collections import namedtuple

User = namedtuple("User",["name", "age", "weight"])

user = User("admin", "20", "60")

name, age, weight = user

print(user[0])

print(name, age, weight)

print(user.name, user.age, user.weight)

# 输出结果如下

admin

admin 20 60

admin 20 60

由以上代码可以看出,namedtuple() 相当于直接定义了一个新的类,但是这个类跟传统的定义 class 的方式又有着巨大的区别。该方式会比直接定义 class 的方式省很多空间,其次其返回值是一个 tuple,支持 tuple 的各种操场。

同时,namedtuple() 还自带两个非常好用的方法。

# 将序列直接转换为新的 tuple 对象

user = ["root", 32, 65]

user = User._make(user)

print(user)

# 输出 User(name='root', age=32, weight=65)

# 返回一个 dict

user = User("admin", 20, 60)

print(user._asdict())

# 输出 OrderedDict([('name', 'admin'), ('age', 20), ('weight', 60)])

2.2 ChainMap 功能讲解

ChainMap() 可以将多个字典集合到一个字典中去,对外提供一个统一的视图。注意:该操作并是不将所有字典做了一次拷贝,实际上是在多个字典的上层又进行了一次封装而已。

from collections import ChainMap

user1 = {"name":"admin", "age":"20"}

user2 = {"name":"root", "weight": 65}

users = ChainMap(user1, user2)

print(users.maps)

users.maps[0]["name"] = "tiger"

print(users.maps)

for key, value in users.items():

print(key, value)

# 输出如下

[{'name': 'admin', 'age': '20'}, {'name': 'root', 'weight': 65}]

[{'name': 'tiger', 'age': '20'}, {'name': 'root', 'weight': 65}]

name tiger

weight 65

age 20

由此可见,如果 ChainMap() 中的多个字典有重复 key,查看的时候可以看到所有的 key,但遍历的时候却只会遍历 key 第一次出现的位置,其余的忽略。同时,我们可以通过返回的新的视图来更新原来的的字典数据。进一步验证了该操作不是做的拷贝,而是直接指向原字典。

2.3 deque 功能详解

dqueue 是 ”double-ended queue” 的简称,是一种类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)操作。大大加快了遍历速度

from collections import deque

q = deque([1, 2, 3])

q.append('4')

q.appendleft('0')

print(q)

print(q.popleft())

# 输出如下

deque(['0', 1, 2, 3, '4'])

0

2.4 Counter 功能详解

Counter 可以简单理解为一个计数器,可以统计每个元素出现的次数,同样 Counter() 是需要接受一个可迭代的对象的。

from collections import Counter

animals = ["cat", "dog", "cat", "bird", "horse", "tiger", "horse", "cat"]

animals_counter = Counter(animals)

print(animals_counter)

print(animals_counter.most_common(2))

Counter({'cat': 3, 'horse': 2, 'dog': 1, 'bird': 1, 'tiger': 1})

[('cat', 3), ('horse', 2)]

# 输出如下

Counter({'cat': 3, 'horse': 2, 'dog': 1, 'bird': 1, 'tiger': 1})

[('cat', 3), ('horse', 2)]

其实一个 Counter 就是一个字典,其额外提供的 most_common() 函数通常用于求 Top k 问题。

2.5 OrderedDict 功能详解

OrderedDict 是字典的子类,保证了元素的插入顺序。在 3.7 版本下,字典同样也保证了元素的插入顺序。那相比内置字典 OrderedDict 有哪些升级呢。

算法上, OrderedDict 可以比 dict 更好地处理频繁的重新排序操作。在跟踪最近的访问这种场景(例如在 LRU cache)下非常适用。

OrderedDict 类有一个 move_to_end() 方法,可以有效地将元素移动到任一端。

from collections import OrderedDict

user = OrderedDict()

user["name"] = "admin"

user["age"] = 23

user["weight"] = 65

print(user)

user.move_to_end("name") # 将元素移动至末尾

print(user)

user.move_to_end("name", last = False) # 将元素移动至开头

print(user)

# 输出如下

OrderedDict([('name', 'admin'), ('age', 23), ('weight', 65)])

OrderedDict([('age', 23), ('weight', 65), ('name', 'admin')])

OrderedDict([('name', 'admin'), ('age', 23), ('weight', 65)])

2.6 defaultdict 功能详解

defaultdict 是内置 dict 类的子类。它实现了当 key 不存在是返回默认值的功能,除此之外,与内置 dict 功能完全一样。

from collections import defaultdict

default_dict = defaultdict(int)

default_dict["x"] = 10

print(default_dict["x"])

print(default_dict["y"])

# 输出如下

10

0

注意,defaultdict 的参数必须是可操作的。比如 python 内置类型,或者无参的可调用的函数。

def getUserInfo():

return {

"name" : "",

"age" : 0

}

default_dict = defaultdict(getUserInfo)

admin = default_dict["admin"]

print(admin)

admin["age"] = 34

print(admin)

# 输出如下

{'name': '', 'age': 0}

{'name': '', 'age': 34}

上述示例我们给 defaultdict 传了一个自定义函数,当字典中不存在所取 key 时返回默认的用户信息。

collections 总结

本文总结了 collections 提供的便利的操作,掌握这些知识将大大提高你的编程效率。

4. 代码地址

参考资料

关注公众号:python技术,回复"python"一起学习交流

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

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

相关文章

ddns 被解析为127.0.0.1_我为北京冬奥加油,2020.2.1-2.10冬奥知识分享

2020.02.01中国冬梦,世界飞跃,我是果雪儿小小志愿者仇懿琛,我为北京冬奥加油,今天冬奥知识分享——冬奥会历史上那些非凡而又卓越的运动员(十一)明星运动员:米特迈尔第十二届冬季奥运会时间:1976.02.04-02.…

乱码 转ios_王者荣耀:转区数量提升25倍,教你解决检测异常,IOS也有艾琳了

王者峡谷近期最火的一个功能便是转区服务开放限量测试,由于申请的人数非常多,官方决定从今日起将测试资格由最初的2000个提升至每日开放50000个,同时由每日二次开放调整为每日一次,虽说测试资格数量提升了25倍,但依旧有…

冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱

前言原本一直在用罗技的G700s,但是鉴于众所周知的“电老虎”原因,再加上重量的问题,一直想换一个鼠标试试,虽然不太玩游戏,但是平时使用也喜欢高DPI的设置、另外还稍许有点汗手的问题,所以对鼠标长时间时候…

vue内检测是否有swiper_vue.js怎么用swiper

vue.js中使用swiper的方法:首先下载【swiper.js】;然后在【main.js】中全局引入【swiper.js】;最后在模板中配置相关内容即可。【相关文章推荐:vue.js】vue.js中使用swiper的方法:1、下载swiper.jsnpm install vue-awe…

mysql创建个自增id的表_MySQL数据库--怎样创建一张用户表,ID设置为自动增长列(新手必会)...

-- phpMyAdmin SQL Dump-- version 3.3.8.1-- http://www.phpmyadmin.net---- 主机: w.rdc.sae.sina.com.cn:3307-- 生成日期: 2011 年 08 月 19 日 16:18-- 服务器版本: 5.1.47-- PHP 版本: 5.2.9---- 数据库: app_tushow---- ----------------------------------------------…

从sqlite 迁移 mysql_将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库

下面我们就来说说如何从 SQLite 迁移到 MySQL 。准备首先你要已经安装好 MySQL 数据库。如果你用的是 Ubuntu 系统,请参考这篇文章。其他系统请参考各自对应的文档。导出当前数据点击蓝色的 EXPORT 按钮将当前数据库中的所有数据导出并下载到本地,默认文…

易语言mysql验证_易语言MySql注册登录

用到的主要易语言命令:连接MySql (, , , , )执行SQL语句 (, )取记录集 ()读字段值 (, , )释放记录集 ()断开MySql ()命令介绍:①、连接MySql (, , , , ):顾名思义,这条命令是用来连接你的MySql数据库的,返回一个MySql句…

mysql 数据库设置mysql注入_MYSQL数据库浅析MySQL的注入安全问题

《MYSQL数据库浅析MySQL的注入安全问题》要点:本文介绍了MYSQL数据库浅析MySQL的注入安全问题,希望对您有用。如果有疑问,可以联系我们。如果把用户输入到一个网页,将其插入到MySQL数据库,有机会离开了发生安全问题被称为SQL注入敞开.这一课将…

php链接mysql编码错误_php 操作 mysql 数据库 编码 错误

有两行相同的代码,来自不同的 php 文件,在对 MySql 数据库(UTF-8格式)操作时,一行代码正常,一行代码异常代码1,异常update ordersystem.product Set PName333汽车 Where BianhaoX…

mysql 数据记录导出_mysql如何导出600万条记录的数据表?

目前我这么写:/*** Created by IntelliJ IDEA.* User: felix* Date: 2019-03-01* Time: 18:49*/set_time_limit(0);$servername localhost;$username ;$password ;$dbname ;$i 57007;$bingTime microtime(true);echo bing . $bingTime . s . PHP_EOL;while …

mysql sql使用序列_SQL 使用序列

SQL 使用序列序列是根据需要产生的一组有序整数:1, 2, 3 ... 序列在数据库中经常用到,因为许多应用要求数据表中的的每一行都有一个唯一的值,序列为此提供了一种简单的方法。本节阐述在 MySQL 中如何使用序列。使用 AUTO_INCREMENT 列&#x…

jmeter mysql查询结果提取_Jmeter-从数据库中获取数据并作为变量使用

一、导入数据库驱动包;(1)、在网上搜索下载数据库驱动包(MySQL的地址https://dev.mysql.com/downloads/file/?id480090)(2)、解压,获取到jar包,并将其复制到Jmeter的安装路径下的\lib文件夹下面;重启Jmeter就已经成功导入了&…

java 如何跟多个字符串比较_Stack Overflow上370万浏览量的一个问题:如何比较Java的字符串...

在逛 Stack Overflow 的时候,发现了一些访问量像喜马拉雅山一样高的问题,比如说这个:如何比较 Java 的字符串?访问量足足有 370万,这不得了啊!说明有很多很多的程序员被这个问题困扰过。截止到目前为止&…

个人对于MySQL的理解_MySQL锁的理解

一、事务四要素:ACID原子性(Atomicity):要么做完,要么啥都不做,没有中间状态一致性(Consistency):这个是个比较有争议的概念,个人理解是通过AID来保证数据正确性,保证从一个状态到下一个状态是正…

linux mysql 5.6.23_mysql 5.6.23 的安装

安装mysql5.6.231. 先安装cmakeyum -y install gcc gcc-ctar zxvf /home/aa/cmake-3.1.3.tar.gz -C /usr/src/cd /usr/src/cmake-3.1.3/./configuremake && make install2. 安装mysql 5.6.23useradd -M -s /sbin/nologin mysqlyum -y install ncurses ncurses-devel bi…

thinkphp mysql exp_thinkphp备份数据库的方法分享

貌似THINKPHP没有备份数据库的方法,所以我自己写了一个,数据库连接和事务处理用的是pdo,如果有需要的可以联系我,写个mysql或者mysqli的class SqlAction extends Action{function outsql(){header(“Content-Type:text/html;chars…

mysql+distinct+max_MySQL中distinct与group by之间的性能进行比较

最近在网上看到了一些测试,感觉不是很准确,今天亲自测试了一番。得出了结论,测试过程在个人计算机上,可能不够全面,仅供参考。测试过程:准备一张测试表CREATE TABLE test_test (id int(11) NOT NULL auto_i…

增大mysql修改表空间_innodb系统表空间维护方法

环境说明:有一个在运行中的mysql环境,由于之前的配置文件设置的过于简单(没有配置innodb_data_file_path变更);造成现在系统表空间已经满了如果innodb_data_file_path之前没有设置那么它会采用默认值:innodb_data_file_pathibdata1:12M&#…

mysql的内外连接_MYSQL的内外连接

1、内联接(典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符)。包括相等联接和自然联接。内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如&#xff0c;检索 students和courses表中学生标识号相同的所有行。2、外联接。外联接可以是左向外联…

java classes 路径_Java获取项目路径及classes路径

1.获取项目绝对路径一String rootPath request.getSession().getServletContext().getRealPath("/").replace("\\", "/");获取内容如下&#xff1a;D:/apacheTomcat/apache-tomcat-7.0.59/webapps/test/2.获取web工程名String projectName req…