当前位置:首页 » Python爬虫 » 详细分析Python collections东西库

详细分析Python collections东西库

159°c 2021年03月15日 07:51 Python爬虫 0条评论
  移步手机端

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章

今天为大家介绍python当中一个很好用也是很基础的工具库,叫做collections。

collection在英文当中有容器的意思,所以顾名思义,这是一个容器的集合。这个库当中的容器很多,有一些不是很常用,本篇文章选择了其中最常用的几个,一起介绍给大家。

defaultdict

defaultdict可以说是这个库当中使用最简单的一个,并且它的定义也很简单,我们从名称基本上就能看得出来。它解决的是我们使用dict当中最常见的问题,就是key为空的情况。

在正常情况下,我们在dict中获取元素的时候,都需要考虑key为空的情况。如果不考虑这点,那么当我们获取了一个不存在的key,会导致系统抛出异常。我们当然可以在每次get之前写一个if判断,但是这很麻烦,比如:

if key in dict:
  return dict[key]
else:
  return None

当然,这是最笨的方法,dict当中为我们提供了带默认值的get方法。比如,我们可以写成:

return dict.get(key, None)

这样,当key不在dict当中存在的时候,会自动返回我们设置的默认值。这个省去了很多麻烦的判断,但是在一些特殊情况下仍然存在一点问题。举个例子,比如当key存在重复,我们希望将key相同的value存进一个list当中,而不是只保留一个。这种情况下写成代码就会比较复杂:

data = [(1, 3), (2, 1), (1, 4), (2, 5), (3, 7)]
d = {}
for k, v in data:
  if k in d:
    d[k].append(v)
  else:
    d[k] = [v]

由于dict的value是一个list,所以我们还是需要判断是否为空,不能直接使用默认值,间接操作当然可以,但是还是不够简单:

for k, v in data:
  cur = d.get(k, [])
  cur.append(v)
  d[k] = v

这和使用if区别并不大,为了完美解决这个问题,我们可以使用collections当中的defaultdict:

from collections import defaultdict
d = defaultdict(list)

for k, v in data:
  d[k].append(v)

使用defaultdict之后,如果key不存在,容器会自动返回我们预先设置的默认值。需要注意的是defaultdict传入的默认值可以是一个类型也可以是一个方法。如果我们传入int,那么默认值会被设置成int()的结果,也就是0,如果我们想要自定义或者修改,我们可以传入一个方法,比如:

d = defaultdict(lambda: 3)

for k, v in data:
  d[k] += v

Counter

这是一个非常常用和非常强大的工具,我们经常用到。

在我们实际的编程当中,我们经常遇到一个问题,就是数数和排序。比如说我们在分析文本的时候,会得到一堆单词。其中可能有大量的长尾词,在整个文本当中可能只出现过寥寥几次。于是我们希望计算一下这些单词出现过的数量,只保留出现次数最高的若干个。

这个需求让我们自己实现当然也不困难,我们完全可以创建一个dict,然后对这些单词一个一个遍历。原本我们还需要考虑单词之前没有出现过的情况,如果我们上面说的defaultdict,又要简单许多。但是我们还是少不了计数然后排序的步骤,如果使用Counter这个步骤会缩减成一行代码。

举个例子:

words = ['apple', 'apple', 'pear', 'watermelon', 'pear', 'peach']
from collections import Counter
counter = Counter(words)

>>> print(counter)

Counter({'apple': 2, 'pear': 2, 'watermelon': 1, 'peach': 1})

我们直接将一个list传入Counter中作为参数,它会自动为我们替当中的每个元素计数。

如果我们要筛选topK,也非常简单,它为我们提供了most_common方法,我们只需要传入需要求的K即可:

counter.most_common(1)

[('apple', 2)]

除此之外,它的构造函数还接收dict类型。我们可以直接通过一个value是int类型的dict来初始化一个Counter,比如:

c = Counter({'apple': 5, 'pear': 4})
c = Counter(apple=4, pear=3)

并且,它还支持加减法的操作,比如我们可以将两个Counter相加,它会自动将两个Counter合并,相同的key对应的value累加。相减也是同理,会将能对应的value做减法,被减的key对应不上的会保留,而减数中对应不上的key则会被丢弃。并且需要注意,Counter支持value为负数。

deque

我们都知道queue是队列,deque也是队列,不过稍稍特殊一些,是双端队列。对于queue来说,只允许在队尾插入元素,在队首弹出元素。而deque既然称为双端队列,那么说明它的队首和队尾都支持元素的插入和弹出。相比于普通的队列,要更加灵活一些。

除了常用的clear、copy、count、extend等api之外,deque当中最常用也是最核心的api还有append、pop、appendleft和popleft。从名字上我们就看得出来,append和pop和list的append和pop一样,而appendleft和popleft则是在队列左侧,也就是头部进行pop和append的操作。非常容易理解。

在日常的使用当中,真正用到双端队列的算法其实不太多。大多数情况下我们使用deque主要有两个原因,第一个原因是deque收到GIL的管理,它是线程安全的。而list则没有GIL锁,因此不是线程安全的。也就是说在并发场景下,list可能会导致一致性问题,而deque不会。另一个原因是deque支持固定长度,当长度满了之后,当我们继续append时,它会自动弹出最早插入的数据。

比如说当我们拥有海量的数据,我们不知道它的数量,但是想要保留最后出现的指定数量的数据的时候,就可以使用deque。

from collections import deque
dque = deque(maxlen=10)
# 假设我们想要从文件当中获取最后10条数据
for i in f.read():
  dque.append(i)

namedtuple

namedtuple很特殊,它涉及到元编程的概念。简单介绍一下元编程的概念,我们不做过多的深入。简而言之,就是在常见的面向对象当中。我们都是定义类,然后通过类的构造函数来创建实例。而元编程指的是我们定义元类,根据元类创建出来的并不是一个实例,而是一个类。如果用模具和成品来分别比喻类和实例的话,元类相当于是模具的模具。

namedtuple是一个非常简单的元类,通过它我们可以非常方便地定义我们想要的类。

它的用法很简单,我们直接来看例子。比如如果我们想要定义一个学生类,这个类当中有name、score、age这三个字段,那么这个类会写成:

class Student:
  def __init__(self, name=None, score=None, age=None):
    self.name = name
    self.score = score
    self.age = age

这还只是粗略的写法,如果考虑规范,还需要定义property等注解,又需要很多代码。如果我们使用namedtuple可以简化这个工作,我们来看代码:

from collections import namedtuple
# 这个是类,columns也可以写成'name score age',即用空格分开
Student = namedtuple('Student', ['name', 'score', 'age'])

# 这个是实例
student = Student(name='xiaoming', score=99, age=10)
print(student.name)

通过使用namedtuple,我们只需要一行就定义了一个类,但是这样定义的类是没有缺失值的,但是namedtuple很强大,我们可以通过传入defaults参数来定义缺失值。

Student = namedtuple('Student', ['name', 'score', 'age'], defaults=(0, 0))

可以注意到,虽然我们定义了三个字段,但是我们只设置了两个缺失值。在这种情况下,namedtuple会自动将缺失值匹配上score和age两个字段。因为在python的规范当中,必选参数一定在可选参数前面。所以nuamdtuple会自动右对齐。

细数一下,我们今天的文章当中介绍了defaultdict、Counter、deque和namedtuple这四种数据结构的用法。除了这四个之外,collections库当中还有一些其他的工具类,只是我们用的频率稍稍低一些,加上由于篇幅的原因,这里就不多做赘述了。感兴趣的同学可以自行查看相关的api和文档。

以上就是详细分析python -collections工具库的详细内容,更多关于python ()collections工具库的资料请关注python学习网其它相关文章!

欢迎阅读本文,希望本文对您有所帮助!

本文链接:http://www.cqrxzs.com/2917.html

版权声明:本文为原创文章,版权归 雨凡教育 所有,欢迎分享本文,转载请保留出处!

百度推荐获取地址:http://tuijian.baidu.com/,百度推荐可能会有一些未知的问题,使用中有任何问题请直接联系百度官方客服!

评论(0) 赞助本站

发表评论:


【顶】 【踩】 【好】 【懵】 【赞】 【表情】

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

推荐阅读
04月21日

python完成猜数字游戏

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 4514次

表明: 本例取材于《Python编程快速上手》。事例非常简单我不多讲了 立即上代码,给入门python练习用。 让你6次机遇猜对一个事先转化成好的1-20中间的整数。遮盖一下知识要点: if语句 操纵句子 random涵数 载入输入 错误处理 代码: """ 猜数字 """ from random import * secretNumber = randint(1, 20) # print(secretNumber) print('猜一个1-20中间的整数。') pri...

04月21日

Python pip 安装与应用(安装、升级、删除)

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 4204次

pip 是 Python 包可视化工具,该专用工具出示了对Python 包的搜索、下载、安装、卸载掉的作用。 pip检验升级 命令:pip list –outdated pip升级包 命令:pip install --upgrade packagename pip卸载包 命令:pip uninstall packagename pip -i 和 -U 主要参数 事例: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple...

04月20日

python集合的创建、添加及删除操作示例

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 341次

文中案例叙述了python集合的建立、加上及删掉实际操作。共享给大伙儿供大伙儿参照,实际以下: 集合时混乱可变的编码序列,集合中的原素放到{}内,集合中的原素具备唯一性。 集合中只有包含数据、字符串数组、元组等不可变的种类数据信息(换句话说可hach),而不可以包含列表、字典、集合等可变的种类数据信息 1.集合的建立 方式一:把集合立即取值给一个自变量 >>> num={1,2,3,4} 方式二:应用range目标 >>> a=set(range(...

04月20日

python的命名规则知识点总结

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 344次

python命名标准 命名设计风格 python几类不一样命名设计风格 骆驼峰式命名法(WjW) 混合式教学命名法(wjWj) 大写(WJWJWJ)或大写加下划线(WJWJWJ) 作为前缀(wjing)或后缀名(ingwj)下划线,有时候双下划线 变量 python变量分成: (1)常量 (2)公有制和独享变量 1.常量 常量全局性变量,应用大写加下划线。特定的变量表明一个常标值。 BASE_DIR = os.path.dirname(os.path.dirname(os.path.absp...

04月19日

golang生成指定位数的随机数的方法

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 318次

1.随机数 随机数,是应用一个可预测性的优化算法推算出来随机数序。在软件开发中常常必须造成随机数,如随机数短信验证码登录、做为唯一真实身份标志数据信息这些。 2.rand库 golang中造成随机数关键有两个包,分别是“math/rand”和“crypto/rand”。 “math/rand”的rand包完成了伪随机数生成器。 "crypto/rand"的rand包完成了用以加解密的更安全性的随机数生成器。 3.生成特定十位数随机数 以生成六位随机数为例子 package main impo...

04月19日

Python3完成zip分卷压缩过程解析

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 329次

应用zipfile库 查询 官方网中文文档 利用 Python 缩小 ZIP 文档,大家第一反应是应用 zipfile 库,殊不知,它的官方网文档中却确立标明“此控制模块现阶段不可以解决分卷 ZIP 文档”,(⊙﹏⊙) 瞎折腾历经 翻边了Google、CSDN、Stackoverflow等服务平台均找不到解决方法,最可靠的是启用外界解压程序完成分卷压缩的作用。可是,怎样不借助外界程序代码这一作用呢?? 因此,只有自身渐渐地造轮子。看见 ZIP 格式房地产商留有的文档 ZIP File Form...

04月19日

Django之应用celery和NGINX生成静态页面完成性能优化

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 297次

性能优化原理: 当我们要给client浏览器返回一个页面时,我们需要去数据库查询数据并将数据和基本页面模板渲染形成页面返回给客户端,但如果每一个用户访问时都去查询一次首页的的数据时,当日访问量很大时那么无疑会给数据库查询带来很大的性能问题。为了解决这个问题,我们可以给未登录用户返回一个早就渲染好的静态首页(给已登录的用户返回一个调用缓存数据和个人数据渲染的页面),这样就可以提高网站的性能了。 使用celery生成静态首页 生成静态页面原理: 在一个为静态首页准备的基础模板之上,获取数据,使用d...

您好,欢迎到访网站!
  查看权限