collections模块 :namedtuple、deque、defaultdict、OrderedDict、ChainMap、Counter
文章目录
- 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
串起来并组成一个逻辑上的dict
。ChainMap
本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。
什么时候使用ChainMap
最合适?举个例子:应用程序往往都需要传入参数,参数可以通过命令行传入,可以通过环境变量传入,还可以有默认参数。我们可以用ChainMap
实现参数的优先级查找,即先查命令行参数,如果没有传入,再查环境变量,如果没有,就使用默认参数。
下面的代码演示了如何查找user
和color
这两个参数:
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相关推荐
- Python collections 模块 namedtuple、Counter、defaultdict
1. namedtuple 假设有两个列表,如下,要判断两个列表中的某一个索引值是否相等. In [7]: p = ['001', 'wohu', '100', 'Shaanxi']In [8]: t ...
- Python中Collections模块namedtuple用法
使用 namedtuple 定义一个新类型 Person,如下所示: Person = namedtuple('Person', ['age', 'height', 'name']) 第二个参数是元组 ...
- python中counter_Python collections模块中counter()的详细说明,Pythoncollections,之,Counter,详解...
collections模块 ==> Python标准库,数据结构常用的模块:collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提 ...
- Python的重要模块:collections (namedtuple、defaultdict、deque、Counter、OrderedDict、ChainMap)
collections 模块作用 包含双端队列 deque.默认字典 defaultdict.命名元组 namedtuple.计数器 Counter.Ordereddict 和 ChainMap 等重 ...
- python collections模块(数据结构常用模块)计数器Counter 双向队列deque 默认字典defaultdict 有序字典OrderedDict 可命名元组namedtuple
collections 模块----Python标准库,是数据结构常用模块 常用类型有: 计数器(Counter) 双向队列(deque) 默认字典(defaultdict) 有序字典(Ordered ...
- python collections 中的 Counter, defaultdict, OrderedDict, namedtuple, deque
1 Counter 计数,以下的例子,找出列表中元素的重复次数: from collections import Counterdevice_temperatures = [13.5, 14.0, 1 ...
- python︱ collections模块(namedtuple/defaultdict/OrderedDict等)
collections有的功能: ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString',\'Count ...
- Python文件操作,时间日期操作,collections增强,Deque(类似java的LinkedList),OrderedDict,Counter
1.文件操作的案例: #文件操作的三种方式 #r = read 读取文件 #w = write 写入文件,覆盖掉 #a = append 追加写入,不会覆盖原有的内容 #读文件 f = open(&q ...
- Python标准库——collections模块的Counter类
更多16 最近在看一本名叫<Python Algorithm: Mastering Basic Algorithms in the Python Language>的书,刚好看到提到这个C ...
- Python标准库collections模块的Counter类
collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类:排 ...
最新文章
- 模型的第一层:详解torch.nn.Embedding和torch.nn.Linear
- 安装多个版本的jdk
- Devstack — screen 调试工具的使用
- 如何在自定义数据源组件中限制用户的更改
- 【数据竞赛】竞赛宝典黑科技:基于开源结果的高端融合策略
- OpenCV中的仿射变换
- CCCC-GPLT L1-034. 点赞 团体程序设计天梯赛
- linux 双显卡 黑屏 amd,ubuntu上AMD显卡驱动黑屏问题的一种解决办法
- stixel_world+Multi_stioxel_world+semantic_stixel_world知识拓展
- Python-正则表达式提取想要的内容
- 深入解读Docker底层技术cgroup系列(4)——cgroup子系统cpu
- 标签打印软件如何批量打印可变内容
- python函数定义时缩进的作用_定义函数时,函数体的正确缩进为?_学小易找答案
- Linux开发板网络直连电脑的设置方法
- 高德地图大头针功能_绘制点标记-在地图上绘制-开发指南-iOS 地图SDK | 高德地图API...
- ip地址+斜杠数字含义
- SAS、scsi、sata、ide硬盘有什么区别
- SpringBoot+Vue+ElementUI实现后台管理系统
- From PHPBB用户手册(感觉很规范的,呵呵)
- 西门子S7-200的VB、VW和VD