python中collections库详解 - vip共享吧
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们


导航菜单
  • 网站首页
  • IT技术笔记
    • Java教程
    • MySql数据库
    • PHP开发
    • Python教程
    • JavaScript
    • SEO优化
    • 常用工具
  • 好资源福利
    • 会员账号共享
  • 网站模板源码
    • 小程序源码
    • 网站源码
  • 共享网络资源
  • 更多功能
    • 留言吐槽
    • 文章归档
    • 我的邻居
    • 史上今日
    • 视频解析
    • 高清壁纸
    • 公告动态
    • 广告合作
    • 关于我们
Python

python中collections库详解

2024/9/5 韩俊  Python教程 615 0

collections 是 Python 内建的一个容器模块,提供了许多有用的容器类或生成容器类的函数,这些类和函数丰富了我们在项目开发过程中常用的数据结构。

这些数据结构大都是 Python 自带容器(list,tuple,set,dict)的子类,我们按项目需求可以作为 Python 自带容器的替代选择。

namedtuple

我们知道 tuple 可以表示不变集合,比如我们用 tuple 来表示一个平面上的点的坐标。

point = (1, 2)
print(point)

我们在进行项目开发中,程序编写的可读性是很重要的一方面,直接用元组的形式初始化一个变量可读性并不是那么好,我们可以用类来封装一个点的坐标。

class Point(object):
    def __init__(self, px, py):
        if isinstance(px, (int, float)) and isinstance(py, (int, float)):
            self.px = px
            self.py = py
        else:
            raise ValueError("请输入整数或浮点数类型数据")

point = Point(1, 2)
print(point.px)
print(point.py)

我们用类来实现点坐标有点小题大做,Python 语言的高级特性,给我们提供了 namedtuple 函数,它用来创建一个自定义的 tuple 类,该类是一个有序集合。

from collections import namedtuple

Point = namedtuple("Point", ['px', 'py'])

point = Point(1, 2)
print(point.px, point.py)  # 可以通过对象直接访问属性

namedtuple 函数返回的是我们定制的 tuple 的子类,我们可以通过对象加入属性来访问里面的值。

from collections import namedtuple

Point = namedtuple("Point", ['px', 'py'])

point = Point(1, 2)
print(point.px, point.py)        # 可以通过对象直接访问属性
print(isinstance(point, tuple))  # Point 类是 tuple 类的子类

deque

我们使用 list 存储数据时,按索引访问元素很快,如果数据比较大,我们插入和删除元素就会很慢,因为 list 需要重新动态分配内存进行构建整个 list,deque 是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。

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

from collections import deque

myq = deque(['p', 'y', 't', 'h', 'o', 'n'])
myq.appendleft('b')
myq.append('d')
print(myq)
myq.pop()
print(myq)
myq.popleft()
print(myq)

defaultdict

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

defaultdict 是 dict 的子类,defaultdict 的构造函数默认参数是 None,如果我们使用默认参数 None,则和 dict 具有一样的用法,比如访问的 key 不存在时,则抛出异常;也可以使用 get 函数,如果引用的 key 不存在时,则返回 None 或给出的默认值。

from collections import defaultdict

def func():
    return "键不存在"

mydftdict = defaultdict()
print(isinstance(mydftdict, dict))  # True,defaultdict 是 dict 的子类
mydftdict['name'] = "老鸟python"
print(mydftdict.get("ruhua"))       # 返回 None
print(mydftdict['ruhua'])           # 抛出异常

我们的 defaultdict 也可以使用接收一个函数作为构造函数的参数,如果引用的 key 不存在时,则返回的是参数函数的调用。

from collections import defaultdict

def func():
    return "键不存在"

mydftdict = defaultdict(func)
mydftdict['name'] = "python"
print(mydftdict['ruhua'])  # 调用 func 函数

OrderedDict

使用 dict 时,Key 并不是按照我们定义时的顺序存储的,因此在对 dict 做迭代时,我们无法确定 Key 的顺序,如果想要保持 Key 的顺序,我们可以用 OrderedDict。

from collections import OrderedDict

mydict = dict()  # Python 解释器的 dict,等价于 mydict = {}
myorddict = OrderedDict()
mydict['a'] = 1
mydict['b'] = 2
mydict['c'] = 3
myorddict['a'] = 1
myorddict['b'] = 2
myorddict['c'] = 3

for item in mydict:
    print(item)         # a,c,b(注意:该结果只能用 python3.6 之前的版本或者 python2 版本)

for item in myorddict:  # a,b,c
    print(item)

OrderedDict 构造函数的参数可以为空,或者 dict,或者配对的 tuple 和 list 等,这和 Python 内置的 dict 的构造函数接收的参数一样。下面我们分别用各种参数形式创建 Python 解释器的 dict 类对象和 Python 内建模块中的 OrderedDict 类的对象,并打印出 dict 对象 和 OrderedDict 对象中的内存中的数据。

from collections import OrderedDict

mydict = dict()  # Python 自带的 dict,等价于 mydict = {}
print(mydict)
mydict = dict({"a": 1, "b": 2, "c": 3})  # 等价于 mydict = {"a": 1, "b": 2, "c": 3}
print(mydict)
mydict = dict((("a", 1), ("b", 2), ("c", 3)))
print(mydict)
mydict = dict((["a", 1], ["b", 2], ["c", 3]))
print(mydict)
mydict = dict([["a", 1], ["b", 2], ["c", 3]])
print(mydict)
mydict = dict([("a", 1), ("b", 2), ("c", 3)])
print(mydict)

myorddict = OrderedDict()
print(myorddict)
myorddict = OrderedDict({"a": 1, "b": 2, "c": 3})
print(myorddict)
myorddict = OrderedDict((("a", 1), ("b", 2), ("c", 3)))
print(myorddict)
myorddict = OrderedDict((["a", 1], ["b", 2], ["c", 3]))
print(myorddict)
myorddict = OrderedDict([["a", 1], ["b", 2], ["c", 3]])
print(myorddict)
myorddict = OrderedDict([("a", 1), ("b", 2), ("c", 3)])
print(myorddict)

用 dict 初始化 OrderedDict 时,顺序还是按照 dict 的内部结构存储的,因为 Python 在构建 dict 时就已经按哈希算法改变了内存的顺序,我们用的只是构建好后的 dict 对象初始化我们的 OrderedDict 对象。

from collections import OrderedDict

myorddict = OrderedDict()

'''
1.Python 解释器只要碰到 {...} 符号,都会调用 dict(...) 来转换。
2.所以对于 {"a": 1, "b": 2, "c": 3},Python 解释器转换为 dict({"a": 1, "b": 2, "c": 3})。
3.而 dict({"a": 1, "b": 2, "c": 3}) 在内存中已经按哈希改变了存储顺序。
'''
myorddict = OrderedDict({"a": 1, "b": 2, "c": 3})
print(myorddict)

注意,Python3.6 之后版本的 dict 显示方式都是按照构建时候的顺序了,也就是说,用了 3.6 之后的版本,dict 和 OrderedDict 没什么区别了。

Counter

Counter 是一个简单的计数器类,它继承 dict 类,如果我们通过 Counter 对象访问的键不存在时,并不会抛出异常,而是返回 0, 我们可以用它统计可迭代的集合的元素个数。

from collections import Counter

str = "hellopython"
ct = Counter()
print(isinstance(ct, dict))  # True

for item in str:
    ct[item] = ct[item] + 1  # 对于 ct[item],如果 item 不存在,默认为 0

print(ct)

当然我们可以用 Counter 统计 Python 自带的任何集合(str,list,tuple,dict,set)中成员出现的个数,集合中的成员可以是任意类型,下面我们以列表为例。

from collections import Counter

mylist = ["ruhua", 3, "xx", 3, 2, "ruhua"]
ct = Counter()

for item in mylist:
    ct[item] = ct[item] + 1  # 对于 ct[item],如果 item 不存在,默认为 0

print(ct)

本节重要知识点

会用 collections 模块的各种函数和类。

清楚 collections 模块里的各种函数或类返回的数据类型。

点赞:0 分享

上一篇
python中itertools模块详解
下一篇
php中$this、static、final、const、self 等几个关键字的用法
作者头像 作者名称 作者性别
韩俊

热门推荐

1 Python3切片
2 python argparse用法总结
3 Python自定义模块
4 python如何实现向上取整
5 Python中type和元类的用法
6 python3类和对象的概念

评论列表

取消回复

    •  
      Login

      韩俊

      趁你现在还有时间,尽你自己最大的努力,努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。这个世界永远比你想的要更精彩,不要败给生活。

      退出登陆
      • 10076文章
      • 455评论
      • 80微语
  • 广告赞助

  • 二零二五年07月
    一二三四五六日
     123456
    78910111213
    14151617181920
    21222324252627
    28293031   
  • 分类

    • 网站模板源码
    • IT技术笔记
    • 好资源分享
    • 共享网络资源
  • 最新文章

      • 分享各大最新影视资源采集站网址合集资源共享
        • 经典的黄句子
          • 迷雾通:免费使用的VPN软件
            • 宝塔如何配置SSH密钥,并使用WinSCP工具远程连接服务器
              • 女人高情商祝福语简短
                • 京东外卖商户入驻指南及详细入驻攻略
                  • git教程及git常用命令指南
                    • 七一活动经典句子
  • 热门文章

    • 酷狗音乐VIP账号 酷狗音乐会员账号共享2017.01.29更新
    • 芒果tv vip会员账号 芒果tv会员账号共享2017.01.29更新
    • 爱奇艺vip账号 爱奇艺/PPS会员账号共享2016.12.12更新
    • 优酷/土豆vip会员账号 优酷会员账号共享2017.01.29更新
    • 活动:免费获得爱奇艺VIP/PPS会员账号50天以上的使用权!
    • 酷我音乐VIP账号 酷我音乐会员账号共享2016.12.31更新
    • 暴风影音会员账号 暴风影音会员账号共享2016.12.31更新
    • m1905会员账号 m1905会员账号共享2016.10.21更新
  • 最新评论

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/10.jpg

      你丫的 文章写得太好了 支持下!![F3...

    • https://www.vipshare8.com/content/templates/meta/Static/images/avatar.jpg

      很棒!刚在某网站看到这个,很欣赏,可惜下...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3861064027

      呃呃呃 oooo

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了111:根据激活的时间有一年的有效期!

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=792480561

      到2025就到期了吗?

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      [blockquote]打卡时间:16:...

    • https://www.vipshare8.com/content/templates/meta/Static/images/tx/7.jpg

      俊哥,想借用迅雷一用!但需要手机验证!看...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=3293901900

      感谢大大的分享

    • https://www.vipshare8.com/content/uploadfile/202103/thum-490d1614564497.png

      回复了好奥v:如果没有解析成功,可以切换接口...

    • https://www.vipshare8.com/content/templates/meta/Api/qqtx.php/?qq=131241242441

      现在视频解析网站怎么用不了啦?

  • 网站统计 I 当前在线:124人

    • 本站管理:1位
    • 用户总数:593位
    • 置顶文章:2篇
    • 日志总数:10076篇
    • 微语总数:80条
    • 评论总数:455条
    • 标签总数:83条
    • 页面总数:8页
    • 分类总数:14个
    • 链接总数:16条
    • 运行天数:3716天
    • 最后更新:7月1日
    • 登录
    • 注册
    • 找回
    Copyright © 2025vip共享吧网站地图 网站备案豫ICP备19004194号-1

    免责声明:本站资源仅供用于学习和交流,本站部分素材内容来源于网络,如有侵权/投稿等,请及时联系站长.

    • 首页
    • 秒懂百科 秒懂百科
    • 搜索
    • 史上今日

    大家都在搜

    • m1905会员账号
    • 腾讯VIP账号共享
    • 经典句子
    • nginx
    • 酷狗VIP账号
    • 乐视视频
    • 土豆vip账号
    • 喜马拉雅FM会员账号
    • 百度云会员账号共享
    • PHP教程
    • VIP电影
    • pptv
    • 搜狐视频会员账号
    • 手机赚钱软件
    • 哔哩哔哩vip会员账号
    • 百度文库下载
    • 
    • 