文章目录

  • namedtuple
  • deque
  • defaultdict
  • OrderedDict
  • ChainMap
  • Counter
  • 参考

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

namedtuple

我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

p = (1, 2)

但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

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

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
p.x
"""
1
"""
p.y
"""
2
"""

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

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

可以验证创建的Point对象是tuple的一种子类:

isinstance(p, Point)
"""
True
"""
isinstance(p, tuple)
"""
True
"""

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

# namedtuple('名称', [属性list]):
Circle = namedtuple('Circle', ['x', 'y', 'r'])

deque

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
q.appendleft('y')
q
"""
deque(['y', 'a', 'b', 'c', 'x'])
"""

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

defaultdict

collections的defaultdict使用

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

from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1'] # key1存在
"""
'abc'
"""
dd['key2'] # key2不存在,返回默认值
"""
'N/A'
"""

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

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

OrderedDict

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

collections.OrderedDict()

如果要保持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 = capacitydef __setitem__(self, key, value):containsKey = 1 if key in self else 0if 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)

ChainMap

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

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

下面的代码演示了如何查找usercolor这两个参数:

from collections import ChainMap
import 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=red
user=guest

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

$ python3 use_chainmap.py -u bob
color=red
user=bob

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

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

Counter

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

from collections import Counter
c = Counter()
for ch in 'programming':c[ch] = c[ch] + 1c"""
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
"""c.update('hello') # 也可以一次性update
c"""
Counter({'r': 2, 'o': 2, 'g': 2, 'm': 2, 'l': 2, 'p': 1, 'a': 1, 'i': 1, 'n': 1, 'h': 1, 'e': 1})
"""

Counter实际上也是dict的一个子类,上面的结果可以看出每个字符出现的次数。

参考

use_collections.py

': 1, ‘a’: 1, ‘i’: 1, ‘n’: 1, ‘h’: 1, ‘e’: 1})
“”"


`Counter`实际上也是`dict`的一个子类,上面的结果可以看出每个字符出现的次数。## 参考[use_collections.py](https://github.com/michaelliao/learn-python3/blob/master/samples/commonlib/use_collections.py)

collections模块 :namedtuple、deque、defaultdict、OrderedDict、ChainMap、Counter相关推荐

  1. Python collections 模块 namedtuple、Counter、defaultdict

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

  2. Python中Collections模块namedtuple用法

    使用 namedtuple 定义一个新类型 Person,如下所示: Person = namedtuple('Person', ['age', 'height', 'name']) 第二个参数是元组 ...

  3. python中counter_Python collections模块中counter()的详细说明,Pythoncollections,之,Counter,详解...

    collections模块 ==> Python标准库,数据结构常用的模块:collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提 ...

  4. Python的重要模块:collections (namedtuple、defaultdict、deque、Counter、OrderedDict、ChainMap)

    collections 模块作用 包含双端队列 deque.默认字典 defaultdict.命名元组 namedtuple.计数器 Counter.Ordereddict 和 ChainMap 等重 ...

  5. python collections模块(数据结构常用模块)计数器Counter 双向队列deque 默认字典defaultdict 有序字典OrderedDict 可命名元组namedtuple

    collections 模块----Python标准库,是数据结构常用模块 常用类型有: 计数器(Counter) 双向队列(deque) 默认字典(defaultdict) 有序字典(Ordered ...

  6. python collections 中的 Counter, defaultdict, OrderedDict, namedtuple, deque

    1 Counter 计数,以下的例子,找出列表中元素的重复次数: from collections import Counterdevice_temperatures = [13.5, 14.0, 1 ...

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

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

  8. Python文件操作,时间日期操作,collections增强,Deque(类似java的LinkedList),OrderedDict,Counter

    1.文件操作的案例: #文件操作的三种方式 #r = read 读取文件 #w = write 写入文件,覆盖掉 #a = append 追加写入,不会覆盖原有的内容 #读文件 f = open(&q ...

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

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

  10. Python标准库collections模块的Counter类

    collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类:排 ...

最新文章

  1. 模型的第一层:详解torch.nn.Embedding和torch.nn.Linear
  2. 安装多个版本的jdk
  3. Devstack — screen 调试工具的使用
  4. 如何在自定义数据源组件中限制用户的更改
  5. 【数据竞赛】竞赛宝典黑科技:基于开源结果的高端融合策略
  6. OpenCV中的仿射变换
  7. CCCC-GPLT L1-034. 点赞 团体程序设计天梯赛
  8. linux 双显卡 黑屏 amd,ubuntu上AMD显卡驱动黑屏问题的一种解决办法
  9. stixel_world+Multi_stioxel_world+semantic_stixel_world知识拓展
  10. Python-正则表达式提取想要的内容
  11. 深入解读Docker底层技术cgroup系列(4)——cgroup子系统cpu
  12. 标签打印软件如何批量打印可变内容
  13. python函数定义时缩进的作用_定义函数时,函数体的正确缩进为?_学小易找答案
  14. Linux开发板网络直连电脑的设置方法
  15. 高德地图大头针功能_绘制点标记-在地图上绘制-开发指南-iOS 地图SDK | 高德地图API...
  16. ip地址+斜杠数字含义
  17. SAS、scsi、sata、ide硬盘有什么区别
  18. SpringBoot+Vue+ElementUI实现后台管理系统
  19. From PHPBB用户手册(感觉很规范的,呵呵)
  20. 西门子S7-200的VB、VW和VD

热门文章

  1. CentOS 7/RHEL 7忘记root密码最简单的修改方法
  2. Java IO--字节-字符流转换
  3. C编程语言中16位整型数据的取值范围介绍
  4. Smack 4.3.4 API
  5. SpringBoot学习之logback.xml 配置指定包或类输出至单独的日志文件中
  6. win10系统的快捷键
  7. php基础-php基本语法
  8. Codeforces Round #110 (Div. 2)
  9. Graham-Scan小总结——toj2317 Wall
  10. 每一次结束只是一次新的起点,深有体会。