python内置模块collections介绍

python内置模块collections介绍

python内置模块collections介绍

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

1、namedtuple

python提供了很多非常好用的基本类型,比如不可变类型tuple,我们可以轻松地用它来表示一个二元向量。

推荐学习:Python视频教程  

立即学习“Python免费学习笔记(深入)”;

>>> v = (2,3)

登录后复制

我们发现,虽然(2,3)表示出了一个向量的两个坐标,但是,如果没有额外说明,又很难直接看出这个元组是用来表示一个坐标的。

为此定义一个class又小题大做了,这时,namedtuple就派上用场了。

>>> from collections import namedtuple>>> Vector = namedtuple('Vector', ['x', 'y'])>>> v = Vector(2,3)>>> v.x2>>> v.y3

登录后复制

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

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

我们可以验证创建的Vector对象的类型。

>>> type(v)>>> isinstance(v, Vector)True>>> isinstance(v, tuple)True

登录后复制

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

>>> Circle = namedtuple('Circle', ['x', 'y', 'r'])# namedtuple('名称', [‘属性列表’])

登录后复制

2、deque

在数据结构中,我们知道队列和堆栈是两个非常重要的数据类型,一个先进先出,一个后进先出。在python中,使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向链表结构,非常适合实现队列和堆栈这样的数据结构。

>>> from collections import deque>>> deq = deque([1, 2, 3])>>> deq.append(4)>>> deqdeque([1, 2, 3, 4])>>> deq.appendleft(5)>>> deqdeque([5, 1, 2, 3, 4])>>> deq.pop()4>>> deq.popleft()5>>> deqdeque([1, 2, 3])

登录后复制

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

3、defaultdict

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

>>> from collections import defaultdict>>> dd = defaultdict(lambda: 'defaultvalue')>>> dd['key1'] = 'a'>>> dd['key1']'a'>>> dd['key2'] # key2未定义,返回默认值'defaultvalue'

登录后复制

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

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

4、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': 2}>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])>>> od # OrderedDict的Key是有序的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 OrderedDictclass LastUpdatedOrderedDict(OrderedDict):    def __init__(self, capacity):        super(LastUpdatedOrderedDict, self).__init__()        self._capacity = capacity    def __setitem__(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)

登录后复制

5、ChainMap

ChainMap可以把一组dict串起来并组成一个逻辑上的dict。ChainMap本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。

什么时候使用ChainMap最合适?举个例子:应用程序往往都需要传入参数,参数可以通过命令行传入,可以通过环境变量传入,还可以有默认参数。我们可以用ChainMap实现参数的优先级查找,即先查命令行参数,如果没有传入,再查环境变量,如果没有,就使用默认参数。

下面的代码演示了如何查找user和color这两个参数。

from collections import ChainMapimport os, argparse# 构造缺省参数:defaults = {    'color': 'red',    'user': 'guest'}# 构造命令行参数:parser = argparse.ArgumentParser()parser.add_argument('-u', '--user')parser.add_argument('-c', '--color')namespace = parser.parse_args()command_line_args = { k: v for k, v in vars(namespace).items() if v }# 组合成ChainMap:combined = ChainMap(command_line_args, os.environ, defaults)# 打印参数:print('color=%s' % combined['color'])print('user=%s' % combined['user'])

登录后复制

没有任何参数时,打印出默认参数:

$ python3 use_chainmap.py color=reduser=guest

登录后复制

当传入命令行参数时,优先使用命令行参数:

$ python3 use_chainmap.py -u bobcolor=reduser=bob

登录后复制

同时传入命令行参数和环境变量,命令行参数的优先级较高:

$ user=admin color=green python3 use_chainmap.py -u bobcolor=greenuser=bob

登录后复制

6、Counter

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

from collections import Counter>>> s = 'abbcccdddd'>>> Counter(s)Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})

登录后复制

Counter实际上也是dict的一个子类。

7、小结

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

以上就是python内置模块collections介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2250252.html

(0)
上一篇 2025年2月26日 23:50:08
下一篇 2025年2月19日 06:08:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python正式对外发布的年份

    Python 的作者 吉多・范罗苏姆(Guido van Rossum),荷兰人,2005 年~2012 年 12 月份在 Google 工作,2013 年 1 月份加入 Dropbox,时至今日,吉多・范罗苏姆始终是 Python开发的核…

    2025年2月26日
    200
  • python学习有哪些网站

    作为一个现时代的程序员初学者,除了看书之外,互联网的学习手段也是断不能少的! 以下这些网站,虽说不上全方位的满足你的需求,但是大部分也都能! 国外的大神GitHub :                                    …

    2025年2月26日
    200
  • python是一种面向什么的高级语言

    python是一种面向什么的高级语言? Python是一种面相对象、解释型的计算机程序语言,并已成为学习数据科学、虚拟现实和人工智能的首选编程语言,其设计哲学是“优雅”,“明确”,“简单”。易上手,及时反馈的特点成了很多入门编程世界的首选。…

    2025年2月26日
    200
  • pycharm和python区别是什么

    pycharm和python区别 1、首先它们的下载地址和安装的方式不同; 2、python是一种基本编译环境,就像java和jar一样。pycharm是一种集成开发环境,为了能够让你快速编写代码,便于调试。 3、简单来说:Python是个…

    2025年2月26日
    200
  • 最详细的Python库总结

    库名称简介 Chardet 字符编码探测器,可以自动检测文本、网页、xml的编码。 colorama 主要用来给文本添加各种颜色,并且非常简单易用。 Prettytable 主要用于在终端或浏览器端构建格式化的输出。 立即学习“Python…

    2025年2月26日
    200
  • python中count函数的用法

    python中count函数的用法 Python count()方法 描述 Python count() 方法用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。 count()方法语法: 立即学习“Python免费…

    2025年2月26日
    200
  • Python中的猴子补丁是什么

    属性在运行时的动态替换,叫做猴子补丁(Monkey Patch)。 为什么叫猴子补丁 属性的运行时替换和猴子也没什么关系,关于猴子补丁的由来网上查到两种说法: 1.这个词原来为Guerrilla Patch,杂牌军、游击队,说明这部分不是原…

    2025年2月26日
    200
  • python的两种编程方式是什么

    一、交互式编程 什么是交互式编程,就是在命令行中输入python 命令即可启动交互式编程,提示窗口如下: 而且还用了Python3的print方法打印出一串字符串。 立即学习“Python免费学习笔记(深入)”; 二、脚本式编程 通过脚本参…

    2025年2月26日 编程技术
    200
  • python标识符命名规范是什么

    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如说: 1.标识符是由字符(A~Z 和 a…

    2025年2月26日
    200
  • python时间戳转换日期格式的方法是什么

    日期和时间的相互转换可以利用Python内置模块time和datetime完成,且有多种方法供我们选择,当然转换时我们可以直接利用当前时间或指定的字符串格式的时间格式。 获取当前时间转换 我们可以利用内置模块datetime获取当前时间,然…

    2025年2月26日
    200

发表回复

登录后才能评论