collections

介绍

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

可以把它理解为一个容器,里面提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择

  1. import collections
  2.  
  3. print(dir(collections))
  4. # ['ChainMap', 'Counter', 'Mapping', 'MutableMapping', 'OrderedDict', 'UserDict', 'UserList', 'UserString', '_Link', '_OrderedDictItemsView', '_OrderedDictKeysView', '_OrderedDictValuesView', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__getattr__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_chain', '_collections_abc', '_count_elements', '_eq', '_heapq', '_iskeyword', '_itemgetter', '_nt_itemgetters', '_proxy', '_recursive_repr', '_repeat', '_starmap', '_sys', 'abc', 'defaultdict', 'deque', 'namedtuple']

里面有许多方法,我们只介绍常用的方法。

常用方法

  •  namedtuple() : 创建一个命名元组子类的工厂函数
  •  deque :      高效增删改双向列表,类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop)
  •  defaultdict :   当字典查询时,为key不存在提供一个默认值。
  •  OrderedDict :   有序词典,就是记住了插入顺序
  • Counter :          计数功能

1. namedtuple()  命名元组

参数

  1. collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
  1. typename :  命名的名字,返回一个新的元组子类,名为 typename
  2. field_names : 可以是一个['x', 'y']这样的序列,也可以是'x, y'或者'x y'
  3. rename :     python3.1添加,如果 rename 为真, 无效域名会自动转换成位置名。比如 ['abc', 'def', 'ghi', 'abc'] 转换成 ['abc', '_1', 'ghi', '_3'] , 消除关键词 def 和重复域名 abc 。
  4. defaults :    python3.7添加, defaults 可以为 None 或者是一个默认值的 iterable(可迭代对象)。如果一个默认值域必须跟其他没有默认值的域在一起出现, defaults 就应用到最右边的参数。比如如果域名 ['x', 'y', 'z'] 和默认值 (1, 2) ,那么 x 就必须指定一个参数值 ,y 默认值 1 , z 默认值 2 。
  5. module :     python3.6添加,如果  module  值有定义,命名元组的 __module__ 属性值就被设置。

使用

例如我想定义一个点(x, y),可以给它起个名字为Points

  1. import collections
  2.  
  3. point = collections.namedtuple('Points', ['x', 'y'])
  4. p1 = point(2, 3)
  5. p2 = point(4, 2)
  6.  
  7. print(p1) # Points(x=2, y=3)
  8. print(p2) # Points(x=4, y=2)

用 isinstance 判断其类型

  1. print(isinstance(p1, point)) # True
  2. print(isinstance(p1, tuple)) # True

可以发现它即属于 point 类型,也属于 tuple 类型。

使用 _make 赋值

  1. a= [11, 3]
  2. p1._make(a)
  3. print(p1) # Points(x=11, y=3)

使用 _replace 更改值

  1. p1._replace(x=5)
  2. print(p1) # Points(x=5, y=3)

2. deque 双端队列

参数

  1. collections.deque([iterable[, maxlen]])

返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。

  1. iterable :迭代对象,可以是字符串,列表等可迭代对象。
  2. maxlen :   maxlen  没有指定或者是 None , deque 可以增长到任意长度。否则, deque 就限定到指定最大长度。一旦限定长度的 deque 满了,当新项加入时,同样数量的项就从另一端弹出。

使用

  1. from collections import deque
  2.  
  3. q = deque(['a', 'b', 'c'], maxlen=10)
  4. # 从右边添加一个元素
  5. q.append('d')
  6. print(q) # deque(['a', 'b', 'c', 'd'], maxlen=10)
  7.  
  8. # 从左边删除一个元素
  9. print(q.popleft()) # a
  10. print(q) # deque(['b', 'c', 'd'], maxlen=10)
  11.  
  12. # 扩展队列
  13. q.extend(['i', 'j'])
  14. print(q) # deque(['b', 'c', 'd', 'i', 'j'], maxlen=10)
  15.  
  16. # 查找下标
  17. print(q.index('c')) #
  18.  
  19. # 移除第一个'd'
  20. q.remove('d')
  21. print(q) # deque(['b', 'c', 'i', 'j'], maxlen=10)
  22.  
  23. # 逆序
  24. q.reverse()
  25. print(q) # deque(['j', 'i', 'c', 'b'], maxlen=10)
  26.  
  27. # 最大长度
  28. print(q.maxlen) #

方法全:

  1. append(x):添加 x 到右端。
  2.  
  3. appendleft(x):添加 x 到左端。
  4.  
  5. clear():移除所有元素,使其长度为0.
  6.  
  7. copy():创建一份浅拷贝。3.5 新版功能.
  8.  
  9. count(x):计算deque中个数等于 x 的元素。3.2 新版功能.
  10.  
  11. extend(iterable):扩展deque的右侧,通过添加iterable参数中的元素。
  12.  
  13. extendleft(iterable):扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
  14.  
  15. index(x[, start[, stop]]):返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 3.5 新版功能.
  16.  
  17. insert(i, x):在位置 i 插入 x 。如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 3.5 新版功能.
  18.  
  19. pop():移去并且返回一个元素,deque最右侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
  20.  
  21. popleft():移去并且返回一个元素,deque最左侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
  22.  
  23. remove(value):移去找到的第一个 value 如果没有的话就升起 ValueError
  24.  
  25. reverse():将deque逆序排列。返回 None 3.2 新版功能.
  26.  
  27. rotate(n=1):向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) 向左循环一步就等价于 d.append(d.popleft())
  28.  
  29. Deque对象同样提供了一个只读属性:
  30. maxlenDeque的最大尺寸,如果没有限定的话就是 None

全部方法

3. defaultdict 默认值字典

使用

当key不存在时返回默认值

  1. from collections import defaultdict
  2.  
  3. dd = defaultdict(lambda: 'not exist')
  4. dd['key1'] = 'abc'
  5. print(dd['key1']) # key1存在
  6. # 'abc'
  7. print(dd['key2']) # key2不存在,返回默认值
  8. # 'not exist'

使用 list 作为 default_factory ,很容易将序列作为键值对加入字典:

  1. from collections import defaultdict
  2.  
  3. d = defaultdict(list)
  4. s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
  5.  
  6. for k, v in s:
  7. d[k].append(v)
  8.  
  9. print(d) # defaultdict(<class 'list'>, {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]})

相当于

  1. d = {}
  2. s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
  3.  
  4. for k, v in s:
  5. d.setdefault(k, []).append(v)
  6.  
  7. print(d) # {'yellow': [1, 3], 'blue': [2, 4], 'red': [1]}

设置 default_factory 为 int ,可以很好的用于计数

  1. s = 'mississippi'
  2. d = defaultdict(int)
  3. for k in s:
  4. d[k] += 1
  5.  
  6. print(d) # defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})

4. OrderedDict 有序字典

有序词典就像常规词典一样,但有一些与排序操作相关的额外功能。

但是内置的  dict  类已经有了记住插入顺序的能力(在 Python 3.7 中保证了这种新行为),所以它变得不那么重要了。

使用

popitem(last=True) :有序字典的  popitem()  方法移除并返回一个 (key, value) 键值对。 如果 last 值为真,则按 LIFO 后进先出的顺序返回键值对,否则就按 FIFO 先进先出的顺序返回键值对。

  1. from collections import OrderedDict
  2.  
  3. d = OrderedDict(a=1, b=2, c=3, d=4,e=5)
  4. print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])
  5. print(d.popitem(last=True)) # ('e', 5)
  6. print(d.popitem(last=False)) # ('a', 1)
  7. print(d) # OrderedDict([('b', 2), ('c', 3), ('d', 4)]

move_to_end(key, last=True) :将现有 key 移动到有序字典的任一端。 如果 last 为真值(默认)则将元素移至末尾;如果 last 为假值则将元素移至开头。如果 key 不存在则会触发 KeyError。

  1. from collections import OrderedDict
  2.  
  3. d = OrderedDict(a=1, b=2, c=3, d=4,e=5)
  4. print(d) # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])
  5.  
  6. d.move_to_end(key='c', last=True)
  7. print(d) # OrderedDict([('a', 1), ('b', 2), ('d', 4), ('e', 5), ('c', 3)])
  8.  
  9. d.move_to_end(key='b', last=False)
  10. print(d) # OrderedDict([('b', 2), ('a', 1), ('d', 4), ('e', 5), ('c', 3)])

5. Counter 计数

Counter  是一个  dict  的子类,用于计数可哈希对象。特别方便!

使用

字符串

  1. from collections import Counter
  2.  
  3. c = Counter()
  4. for i in 'sfsadfsdjklgsdla':
  5. c[i] += 1
  6.  
  7. print(isinstance(c,Counter)) # True
  8. print(isinstance(c,dict)) # True
  9. print(c) # Counter({'s': 4, 'd': 3, 'f': 2, 'a': 2, 'l': 2, 'j': 1, 'k': 1, 'g': 1})
  10.  
  11. c2 = Counter('asfjslfjsdlfjgkls')
  12. print(c2) # Counter({'s': 4, 'd': 3, 'f': 2, 'a': 2, 'l': 2, 'j': 1, 'k': 1, 'g': 1})

列表

  1. from collections import Counter
  2.  
  3. c = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])
  4. print(c) # Counter({'blue': 3, 'red': 2, 'green': 1})

elements() :返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一, elements()  将会忽略它。

  1. c = Counter(a=4, b=2, c=0, d=-2)
  2. print(sorted(c.elements())) # ['a', 'a', 'a', 'a', 'b', 'b']

most_common([n]) :返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序。 如果 n 被省略或为 None, most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序:

  1. c = Counter('abracadabra')
  2. print(c.most_common(3)) # [('a', 5), ('b', 2), ('r', 2)]

subtract([iterable-or-mapping]) :从 迭代对象 或 映射对象 减去元素。像  dict.update()  但是是减去,而不是替换。输入和输出都可以是0或者负数。

  1. c = Counter(a=4, b=2, c=0, d=-2)
  2. d = Counter(a=1, b=2, c=3, d=4)
  3. c.subtract(d)
  4. print(c) # Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

附上中文文档,走起...

。。

Python3 collections模块的使用的更多相关文章

  1. Python3 collections模块

    https://www.cnblogs.com/zhangxinqi/p/7921941.html http://www.wjhsh.net/meng-wei-zhi-p-8259022.html h ...

  2. Python3简明教程(十四)—— Collections模块

    collections 是 Python 内建的一个集合模块,提供了许多有用的集合类. 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它们能帮助你解决各种实际问 ...

  3. python的Collections 模块

    Collections 模块 知识点 Counter 类 defaultdict 类 namedtuple 类 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它 ...

  4. 4-24日 collections模块 random模块 time模块 sys模块 os模块

    1, collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdi ...

  5. 《Python》常用模块之collections模块

    内置的数据类型: int  float  complex str  list  tuple dict  set 基础数据类型: int  float  complex str  list  tuple ...

  6. python拓展2 collections模块与string模块

    知识内容 1.collections模块介绍 2.collections模块使用 3.string模块介绍及使用 一.collections模块介绍 collections模块中提供了很多python ...

  7. Python中collections模块的使用

    本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...

  8. Python中的collections模块

    Python中内置了4种数据类型,包括:list,tuple,set,dict,这些数据类型都有其各自的特点,但是这些特点(比如dict无序)在一定程度上对数据类型的使用产生了约束,在某些使用场景下效 ...

  9. python开发模块基础:collections模块&paramiko模块

    一,collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdic ...

随机推荐

  1. C++五:重载 多态

    C++五:重载与多态 一:概述   多态是指同样的消息被不同类型的对象接收导致不同的行为,即接口的多种不同的实现方式.多态可分为静态多态与动态多态.多态类型可分为四类:重载多态,强制多态,包含多态,参 ...

  2. @atcoder - AGC034D@ Manhattan Max Matching

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 考虑一个二维平面,执行共 2*N 次操作: 前 N 次,第 i ...

  3. PHP header 的7种用法

    这篇文章介绍的内容是关于PHP header()的7种用法 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 PHP header 的7种用法 1. 跳转页面 header('Locat ...

  4. 洛谷P2820 局域网

    #include<bits/stdc++.h> using namespace std; ; ; int n,k,sum,tot; struct node{ int cnt,fa; }f[ ...

  5. @gym - 101190B@ Binary Code

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 我们称一组字符串是 "前缀码",当且仅当不存 ...

  6. Springboot应用中@EntityScan和@EnableJpaRepositories的用法

    在Springboot应用开发中使用JPA时,通常在主应用程序所在包或者其子包的某个位置定义我们的Entity和Repository,这样基于Springboot的自动配置,无需额外配置,我们定义的E ...

  7. Android Studio(十二):打包多个发布渠道的apk文件

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  8. 测试代码的执行时间魔法方法%time和%timeit

    对于规模更大.运行时间更长的数据分析应用程序,你可能会希望测试一下各个部分或函数调用或语句的执行时间.你可能会希望了解某个复杂计算过程中到底是哪些函数占用的时间最多.幸运的是,在开发和测试代码的过程中 ...

  9. larave5.6 将Excel文件数据导入数据库代码实例

    <?php namespace App\Admin\Controllers; use App\AdminUser; use Illuminate\Http\Request; use Excel; ...

  10. [C#] ServiceStack.Redis如何批量的pop数据?

    要安全的批量pop数据,有两个办法: 1.用事务(不用事务的话可能导致重复读.ServiceStack的pipeline是没有自带事务的.) 2.执行lua脚本 我这里提供用事务的实现方法: publ ...