collections模块简介

除python提供的内置数据类型(int、float、str、list、tuple、dict)外,collections模块还提供了其他数据类型,使用如下功能需先导入collections模块(import collections):

  • 计数器(counter)
  • 有序字典(orderedDict)
  • 默认字典(defaultdict)
  • 可命名元组(namedtuple)
  • 双向队列(deque)

一、 计数器(Counter):统计元素的个数,并以字典形式返回{元素:元素个数}


Counter类包含方法如下:

1. most_common:将元素出现的次数按照从高到低进行排序,并返回前N个元素,若多个元素统计数相同,按照字母顺序排列,N若未指定,则返回所有元素

def most_common(self, n=None):'''List the n most common elements and their counts from the mostcommon to the least.  If n is None, then list all element counts.>>> Counter('abcdeabcdabcaba').most_common(3)[('a', 5), ('b', 4), ('c', 3)]      '''# Emulate Bag.sortedByCount from Smalltalkif n is None:return sorted(self.items(), key=_itemgetter(1), reverse=True)return _heapq.nlargest(n, self.items(), key=_itemgetter(1))

2. elements:返回一个迭代器,元素被重复多少次,在迭代器中就包含多少个此元素,所有元素按字母序排列,个数<1的不罗列

def elements(self):'''Iterator over elements repeating each as many times as its count.>>> c = Counter('ABCABC')>>> sorted(c.elements())['A', 'A', 'B', 'B', 'C', 'C']# Knuth's example for prime factors of 1836:  2**2 * 3**3 * 17**1>>> prime_factors = Counter({2: 2, 3: 3, 17: 1})>>> product = 1>>> for factor in prime_factors.elements():     # loop over factors...     product *= factor                       # and multiply them>>> product1836Note, if an element's count has been set to zero or is a negativenumber, elements() will ignore it.'''# Emulate Bag.do from Smalltalk and Multiset.begin from C++.return _chain.from_iterable(_starmap(_repeat, self.items()))

3. update:增加元素的重复次数

4. subtract:减少元素重复次数

二、有序字典(orderedDict):继承了dict的所有功能,dict是无序的,orderedDict刚好对dict作了补充,记录了键值对插入的顺序,是有序字典

说明:python v3.6之前的版本dict是无序的,3.6版本之后(含v3.6)dict是有序的,目测为了兼容性以及100%有序性考虑,建议实现有序功能时使用orderedDict

orderedDict类补充方法:

1. clear:清空字典

 def clear(self):'od.clear() -> None.  Remove all items from od.'root = self.__rootroot.prev = root.next = rootself.__map.clear()dict.clear(self)

2. popitem:有序删除,类似于栈,按照后进先出的顺序依次删除

3. pop:删除指定键值对

4. move_to_end:将指定键值对移到最后位置

5. setdefault:设置默认值,默认为None,也可指定值

6. update:更新字典,有则更新,无则添加

三、默认字典(defaultdict):设置values默认类型,如list、tuple

四、可命名元组(namedtuple): 可通过名称访问元组中的元素,提高代码可读性

>>> import colletcions                      #导入collections模块
>>> TupleName=collections.namedtuple('TupleName',['a','b','c'])  #通过namedtuple自定义一个TupleName类
>>> obj=TupleName(11,22,33)                 #通过类创建对象obj
>>> obj.a
>>> 11                                      #通过名称访问元组中的元素
>>> obj.b
>>> 22
>>> obj.a*obj.c
>>> 363

五、双向队列(deque):类似于list,允许两端操作元素

deque类中包含方法:

1. append:从队列右侧添加元素

>>> import collections
>>> deq=collections.deque('abcd')
>>> deq
>>> deque(['a','b','c','d'])
>>> deq.append(11)
>>> deq
>>> deque(['a','b','c','d',11])

2.appendleft:从队列左侧添加元素

>>> import collections
>>> deq=collections.deque('abcd')
>>> deq
>>> deque(['a','b','c','d'])
>>> deq.appendleft(12)
>>> deq
>>> deque([12,'a','b','c','d'])

3.clear:清空队列

>>> import collections
>>> deq=collections.deque('abcd')
>>> deq
>>> deque(['a','b','c','d'])
>>> deq.clear()
>>> deq
>>> deque([])

4. count:统计队列中元素个数

>>> import collections
>>> deq=collections.deque('abcdaa')
>>> deq
>>> deque(['a','b','c','d','a','a'])
>>> deq.count('a')
>>> 3

5.extend:从队列右侧扩展

>>> import collections
>>> deq=collections.deque('abcd')
>>> deq
>>> deque(['a','b','c','d'])
>>> deq.extend(11,22,33)
>>> deq
>>> deque(['a','b','c','d',11,22,33])

6.extendleft:从队列左侧扩展

>>> import collections
>>> deq=collections.deque('abcd')
>>> deq
>>> deque(['a','b','c','d'])
>>> deq.extendleft({'k1':'v1','k2':'v2'})   # 扩展类型为dict,取keys
>>> deq
>>> deque(['k2','k1','a','b','c','d'])    # 取dict中的keys,并从队列左侧依次插入

7.index:取元素索引位置

>>> import collections
>>> deq=collections.deque('abcdaa')
>>> deq
>>> deque(['a','b','c','d','a','a'])
>>> deq.index('a')              # 默认从左侧开始检索
>>> 0
>>> deq.index('a',2,5)    # 在查找范围内若有多个相同的值,返回第一个值的索引
>>> 4

8.insert:在队列任意位置插入值

>>> import collections
>>> deq=collections.deque('abcd')
>>> deq
>>> deque(['a','b','c','d'])
>>> deq.insert(1,11)
>>> deq
>>> deque(['a',11,'b','c','d'])

9. pop:从队列右侧移除值

>>> import collections
>>> deq=collections.deque('abcdef')
>>> deq
>>> deque(['a','b','c','d','e','f'])
>>> deq.pop()
>>> 'f'
>>> deq
>>> deque(['a','b','c','d','e'])

10.popleft:从队列左侧移除值

>>> import collections
>>> deq=collections.deque('abcdef')
>>> deq
>>> deque(['a','b','c','d','e','f'])
>>> deq.popleft()
>>> 'a'
>>> deq
>>> deque(['b','c','d','e','f'])

11. remove:移除指定值

>>> import collections
>>> deq=collections.deque('abcdef')
>>> deq
>>> deque(['a','b','c','d','e','f'])
>>> deq.remove('c')
>>> deq
>>> deque(['a','b','d','e','f'])

12.reverse:将队列中的元素反转

>>> import collections
>>> deq=collections.deque('abcdef')
>>> deq
>>> deque(['a','b','c','d','e','f'])
>>> deq.reverse()
>>> deq
>>> deque(['f','e','d','c',b','a'])

13. rotate:移动队列中的元素,若n<0,则将队列最左侧的元素依次移动至最右侧,反之,n>0,将队列最右侧元素移动至最左侧

>>> import collections
>>> deq=collections.deque('abcdef')     #创建队列
>>> deq
>>> deque(['a','b','c','d','e','f'])
>>> deq.rotate(-2)                      # n<0,依次移动最左侧2个元素至队列最右侧
>>> deq
>>> deque(['c','d','e','f','a','b'])
>>> deq.append(11)                      # 在队列最右侧插入元素
>>> deq
>>> deque(['c','d','e','f','a','b',11])
>>> deq.rotate(2)                       # n>0,依次移动右侧2个元素至队列最左侧
>>> deq
>>> deque(['b',11,'c','d','e','f','a'])

上述既然提到了双向队列,那肯定也存在单项队列,双向队列存在于collections模块中,允许对元素两端进行操作,而单项队列存在于queue模块中,遵循先进先出原则,只能一端进,一端出

queue模块中方法简介:

1. empty:判断队列是否为空,是返回True

def empty(self):'''Return True if the queue is empty, False otherwise (not reliable!).This method is likely to be removed at some point.  Use qsize() == 0as a direct substitute, but be aware that either approach risks a racecondition where a queue can grow before the result of empty() orqsize() can be used.To create code that needs to wait for all queued tasks to becompleted, the preferred technique is to use the join() method.'''with self.mutex:return not self._qsize()
>>> import queue
>>> que=queue.Queue()         # 表示队列的长度,即元素个数,
>>> que.empty()                 # 清空队列,并且判断队列是否为空,是返回True
>>> True

2.full:判断队列是否已满,是返回True

def full(self):'''Return True if the queue is full, False otherwise (not reliable!).This method is likely to be removed at some point.  Use qsize() >= nas a direct substitute, but be aware that either approach risks a racecondition where a queue can shrink before the result of full() orqsize() can be used.'''with self.mutex:return 0 < self.maxsize <= self._qsize()
>>> import queue
>>> que=queue.Queue(2)        # 表示队列的长度,即元素个数,
>>> que.put('a')                # 向队列中添加元素
>>> que.full()                    # 此时队列中有1个元素,即长度为1
>>> False
>>> que.put('b')                     # 此时队列中有2个元素,即长度为2,已满
>>> que.full()
>>> True

3. put:往队列中放一个元素,get:依据先进先出原则,依次从队列取元素

>>> import queue
>>> que=queue.Queue()            # 创建队列,表示队列的长度,即元素个数
>>> que.put('a')                 #往队列中放入一个元素
>>> que.put('b')                  #往队列中再放入一个元素
>>> que.get()
>>> 'a'                          #依据先进先出原则,先取'a',若全部取出,再次获取元素,会wait等待生产者线程添加数据

4. put_nowait:无阻塞的向队列中添加元素,若队列已满,不等待直接报错(full)

def put_nowait(self, item):'''Put an item into the queue without blocking.Only enqueue the item if a free slot is immediately available.Otherwise raise the Full exception.'''return self.put(item, block=False)

5.get_nowait:无阻塞从队列中获取元素,若队列为空,不等待直接报错(empty)

def get_nowait(self):'''Remove and return an item from the queue without blocking.Only get an item if one is immediately available. Otherwiseraise the Empty exception.'''return self.get(block=False)

6.qsize:表示队列长度,即元素个数

def qsize(self):'''Return the approximate size of the queue (not reliable!).'''with self.mutex:return self._qsize()
>>> import queue                 #导入queue模块
>>> que=queue.Queue()       #创建队列
>>> que.put(11)
>>> que.put(22)                   # 往队列中添加元素
>>> que.qsize()                    # 统计元素个数
>>> 2

7.join:阻塞调用线程,直到队列中的所有任务都被处理完成,与task_done配合使用

collections模块简介相关推荐

  1. python counter模块_python collections模块 计数器(counter)

    一.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 把我写入的元素出现的多少次都计算出来 import collectio ...

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

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

  3. Python标准库——collections模块的Counter类

    更多16 最近在看一本名叫<Python Algorithm: Mastering Basic Algorithms in the Python Language>的书,刚好看到提到这个C ...

  4. Python collections 模块 namedtuple、Counter、defaultdict

    1. namedtuple 假设有两个列表,如下,要判断两个列表中的某一个索引值是否相等. In [7]: p = ['001', 'wohu', '100', 'Shaanxi']In [8]: t ...

  5. python中collections_Python中的collections模块

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

  6. collections模块

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

  7. python内置collections模块的使用

    python内置collections模块的使用 文章目录: 一.collections模块说明 1.查看collections模块的定义路径 2.查看collections文档介绍信息 3.查看co ...

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

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

  9. collections模块介绍

    Python作为一个"内置电池"的编程语言,标准库里面拥有非常多好用的模块.比如今天想给大家 介绍的 collections 就是一个非常好的例子. 基本介绍 我们都知道,Pyth ...

最新文章

  1. 持续集成之路——Maven
  2. Android面试知识点(转)
  3. 1.2 边缘检测示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. 【cJSON】CJSON学习笔记(二)
  5. vijos P1051 送给圣诞夜的极光
  6. MyEclipse 清理项目缓存的几大方法
  7. java 原子量Atomic举例(AtomicReference)
  8. xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA收发器架构之硬件设计指导(一)
  9. python人民币和美元转换-【菜鸟学Python】案例一:汇率换算
  10. 元旦用SpringBoot撸了个博客网站送给大家
  11. 关于 类的常成员函数 声明和定义处 都需要加 const的原因
  12. “梧桐杯”中国移动大数据应用创新大赛 - 智慧金融赛道Baseline
  13. java绘制五角星_JAVA 五角星小程序
  14. 关于将Java编译过的.class文件打成jar可执行文件/JAR详解
  15. 机器人辅助的符文天赋_LOL机器人辅助带什么天赋_S9机器人辅助怎么玩_3DM网游...
  16. apmserv中 php版本,APMServ5.2.6的PHP版本升级到5.3、5.4版本的方法
  17. 基于低代码平台(Low Code Platform)开发中小企业信息化项目
  18. mv命令:移动、重命名文件或文件夹
  19. Java实验:重写equals方法
  20. ASM 1——概念简介

热门文章

  1. 8、设计模式-结构型模式-适配器模式
  2. MongoDB 安装配置
  3. 13.MongoDB 连接命令格式
  4. 3.5. Error Prompt
  5. mangodb collection level operations
  6. ubuntu下安装nginx时依赖库zlib,pcre,openssl安装方法
  7. Spring Arm Component
  8. 更改android AVD模拟器创建路径位置的方法
  9. 指定域的名称或安全标识(SID)与该域的信任信息不一致
  10. 透视WPF 应用程序的利器