引言

Python为我们提供了4种基本的数据结构:list, tuple, dict, set,但是在处理数据量较大的情形的时候,这4种数据结构就明显过于单一了,比如list作为单向链表在某些情形插入的效率会比较低,有时候我们也需要维护一个有序的dict。所以这个时候我们就要用到Python标准库为我们提供的collections包了,它提供了多个有用的集合类,熟练掌握这些集合类,不仅可以让我们让写出的代码更加Pythonic,也可以提高我们程序的运行效率。

defaultdict的使用

defaultdict(default_factory)在普通的dict(字典)之上添加了default_factory,使得key(键)不存在时会自动生成相应类型的value(值),default_factory参数可以指定成list, set, int等各种合法类型。

example1>>> from collections import defaultdict>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]

我们现在有上面这样一组list(列表),虽然我们有6组数据,但是仔细观察后发现其实我们只有两种color(颜色),但是每一个color对应多个值。现在我们想要将这个list转换成一个dict(字典),这个dict的key(键)对应一种color,dict的value(值)设置为一个list存放color对应的多个值。我们可以使用defaultdict(list)来解决这个问题。

# d可以看作一个dict(字典),dict的value是一个list(列表)>>> d = defaultdict(list)>>> for k, v in s:...     d[k].append(v)...>>> ddefaultdict(<class 'list'>, {'blue': [2, 4, 4], 'red': [1, 3, 1]})example2

上面这个例子中有一些不完美的地方,比如说{‘blue’: [2, 4, 4], ‘red’: [1, 3, 1]}这个defaultdict中blue颜色中包含两个4,red颜色中包含两个1,但是我们不希望含有重复的元素,这个时候可以考虑使用defaultdict(set)来解决这个问题。set(集合)相比list(列表)的不同之处在于set中不允许存在相同的元素。

>>> d = defaultdict(set)>>> for k, v in s:...     d[k].add(v)...>>> ddefaultdict(<class 'set'>, {'blue': {2, 4}, 'red': {1, 3}})example3>>> s = 'hello world'

通过使用defaultdict(int)的形式我们来统计一个字符串中每个字符出现的个数。

>>> d = defaultdict(int)>>> for k in s:...     d[k] += 1...>>> ddefaultdict(<class 'int'>, {'o': 2, 'h': 1, 'w': 1, 'l': 3, ' ': 1, 'd': 1, 'e': 1, 'r': 1})

OrderedDict的使用

我们知道默认的dict(字典)是无序的,但是在某些情形我们需要保持dict的有序性,这个时候可以使用OrderedDict,它是dict的一个subclass(子类),但是在dict的基础上保持了dict的有序型,下面我们来看一下使用方法。

example1>>> from collections import OrderedDict# 无序的dict>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}这是一个无序的dict(字典),现在我们可以使用OrderedDict来让这个dict变得有序。# 将d按照key来排序>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])# 将d按照value来排序>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])# 将d按照key的长度来排序>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])example2

使用popitem(last=True)方法可以让我们按照LIFO(先进后出)的顺序删除dict中的key-value,即删除最后一个插入的键值对,如果last=False就按照FIFO(先进先出)删除dict中key-value。

>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}# 将d按照key来排序>>> d = OrderedDict(sorted(d.items(), key=lambda t: t[0]))>>> dOrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])# 使用popitem()方法来移除最后一个key-value对>>> d.popitem()('pear', 1)# 使用popitem(last=False)来移除第一个key-value对>>> d.popitem(last=False)('apple', 4)example3

使用move_to_end(key, last=True)来改变有序的OrderedDict对象的key-value顺序,通过这个方法我们可以将排序好的OrderedDict对象中的任意一个key-value插入到字典的开头或者结尾。

>>> d = OrderedDict.fromkeys('abcde')>>> dOrderedDict([('a', None), ('b', None), ('c', None), ('d', None), ('e', None)])# 将key为b的key-value对移动到dict的最后>>> d.move_to_end('b')>>> dOrderedDict([('a', None), ('c', None), ('d', None), ('e', None), ('b', None)])>>> ''.join(d.keys())'acdeb'# 将key为b的key-value对移动到dict的最前面>>> d.move_to_end('b', last=False)>>> ''.join(d.keys())'bacde'

deque的使用

list存储数据的优势在于按找索引查找元素会很快,但是插入和删除元素就很慢了,因为它是是单链表的数据结构。deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈,而且线程安全。

list只提供了append和pop方法来从list的尾部插入/删除元素,但是deque新增了appendleft/popleft允许我们高效的在元素的开头来插入/删除元素。而且使用deque在队列两端添加(append)或弹出(pop)元素的算法复杂度大约是O(1),但是对于list对象改变列表长度和数据位置的操作例如 pop(0)和insert(0, v)操作的复杂度高达O(n)。由于对deque的操作和list基本一致,这里就不重复了。

ChainMap的使用

ChainMap用来将多个dict(字典)组成一个list(只是比喻),可以理解成合并多个字典,但和update不同,而且效率更高。

>>> from collections import ChainMap>>> a = {'a': 'A', 'c': 'C'}>>> b = {'b': 'B', 'c': 'D'}>>> m = ChainMap(a, b)# 构造一个ChainMap对象>>> mChainMap({'a': 'A', 'c': 'C'}, {'b': 'B', 'c': 'D'})>>> m['a']'A'>>> m['b']'B'# 将m变成一个list>>> m.maps[{'a': 'A', 'c': 'C'}, {'b': 'B', 'c': 'D'}]# 更新a中的值也会对ChainMap对象造成影响>>> a['c'] = 'E'>>> m['c']'E'# 从m复制一个ChainMap对象,更新这个复制的对象并不会对m造成影响>>> m2 = m.new_child()>>> m2['c'] = 'f'>>> m['c']'E'>>> a['c']'E'>>> m2.parentsChainMap({'a': 'A', 'c': 'C'}, {'b': 'B', 'c': 'D'})

Counter的使用

example1

Counter也是dict的一个subclass,它是一个无序容器,可以看做一个计数器,用来统计相关元素出现的个数。

>>> from collections import Counter>>> cnt = Counter()# 统计列表中元素出现的个数>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:...  cnt[word] += 1...>>> cntCounter({'blue': 3, 'red': 2, 'green': 1})# 统计字符串中元素出现的个数>>> cnt = Counter()>>> for ch in 'hello':...     cnt[ch] = cnt[ch] + 1...>>> cntCounter({'l': 2, 'o': 1, 'h': 1, 'e': 1})

example2

使用elements()方法按照元素的出现次数返回一个iterator(迭代器),元素以任意的顺序返回,如果元素的计数小于1,将忽略它。

>>> c = Counter(a=4, b=2, c=0, d=-2)>>> cCounter({'a': 4, 'b': 2, 'c': 0, 'd': -2})>>> c.elements()<itertools.chain object at 0x7fb0a069ccf8>>>> next(c)'a'# 排序>>> sorted(c.elements())['a', 'a', 'a', 'a', 'b', 'b']

使用most_common(n)返回一个list, list中包含Counter对象中出现最多前n个元素。

>>> c = Counter('abracadabra')>>> cCounter({'a': 5, 'b': 2, 'r': 2, 'd': 1, 'c': 1})>>> c.most_common(3)[('a', 5), ('b', 2), ('r', 2)]

namedtuple的使用

使用namedtuple(typename, field_names)命名tuple中的元素来使程序更具可读性。

>>> from collections import namedtuple>>> Point = namedtuple('PointExtension', ['x', 'y'])>>> p = Point(1, 2)>>> p.__class__.__name__'PointExtension'>>> p.x1>>> p.y2

来源:华为云社区  作者:清风Python

collections 使用教程相关推荐

  1. Eclipse Collections随Java版本的演变

    \ 本文要点 \\ Eclipse Collections是一个高性能的Java集合框架,针对Java 8及以上版本进行了重新设计,极大地丰富了这个Java Collections框架的功能.\\t ...

  2. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  3. python︱ collections模块(namedtuple/defaultdict/OrderedDict等)

    collections有的功能: ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString',\'Count ...

  4. Python教程:collections的deque()方法

    创建双向队列 import collections d = collections.deque() append(往右边添加一个元素) import collections d = collectio ...

  5. Python中Collections模块的Counter容器类使用教程

    Python中Collections模块的Counter容器类使用教程 1.collections模块 collections模块自Python2.4版本开始被引入,包含了dict,set,list, ...

  6. Jekyll 教程——合集(collections)

    上一篇我们介绍了 Jekyll 的博客功能,本质上博客是一个文章的集合,集合内的文件遵循某种约定. 本篇要介绍的合集(collection)也具备这个功能,两者的不同之处在于: posts 是相对独立 ...

  7. python中collections_Python中collections模块的基本使用教程

    前言 之前认识了python基本的数据类型和数据结构,现在认识一个高级的:Collections,一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module ...

  8. defaultdict python3,Python collections.defaultdict() 与 dict的使用和区别|python3教程|python入门|python教程...

    https://www.xin3721.com/eschool/python.html 在Python里面有一个模块collections,解释是数据类型容器模块.这里面有一个collections. ...

  9. Pandas入门教程

    pandas是基于NumPy的一种数据分析工具,在机器学习任务中,我们首先需要对数据进行清洗和编辑等工作,pandas库大大简化了我们的工作量,熟练并掌握pandas常规用法是正确构建机器学习模型的第 ...

最新文章

  1. 你应该知道的高性能无锁队列Disruptor
  2. Linux Shell脚本攻略学习总结:二
  3. oj contest ranklist时间怎么算的_几次买入基金怎么算持有天数,加仓算在原来持有时间吗...
  4. tensorflow 里metrics_深入理解TensorFlow中的tf.metrics算子
  5. qtplaintextedit如何删除内容_数据库中的数据如何进行批量修改
  6. 十三、Swing绘图技术
  7. 【2015 SACC】 架构之手机淘宝性能优化全记录
  8. Atitit 概念:数据、信息、知识 目录 1. 艾提拉提出的 信息金字塔 数据 信息 知识 智慧 1 1.1. 洞见级别金字塔 数据 信息 知识 2 1.2. 数据 信息 知识韦恩图 3 1
  9. 如何在C ++ 中分割PDF档案?试试Aspose
  10. b站视频突破2倍方法,3倍?4倍?可以开10倍!!!
  11. 手把手教你使用Keras进行人脸检测和识别
  12. IDEA设置类文件模板@Auther@Date等注释信息——idea笔记
  13. 学生成绩管理系统设计
  14. 在Word中打开MathType时出现AutoExecCLS错误解决方案
  15. 海康28181摄像头接入的注意点
  16. 基于HI600的低成本最小RTK系统详细搭建过程
  17. 软工实践 第三次作业 结对作业一
  18. 异世界美食家html,异世界的美食家步方-异世界的美食家全文免费阅读
  19. ZooKeeper :Docker Compose部署ZooKeeper集群
  20. ionic类似时间轴的实现

热门文章

  1. sqlserver 字符串拼接_VB6 连接SQL Server数据库实例
  2. DJango周总结二:模型层,单表,多表操作,连表操作,数据库操作,事务
  3. c++ 初始化列表和构造函数初始化区别
  4. 2018-2019-2 网络对抗技术 20165227 Exp4 恶意代码分析
  5. POJ1958 Strange Towers of Hanoi [递推]
  6. OO前三次作业简单总结
  7. jQuery UI加入效果
  8. 对目前自己的博客做一个小结
  9. php b+树,PHP利用b+树概念实现树形数组
  10. 今晚8点直播丨经典知识库:数据库对象命名设计规范手册