Python中好用又高效的Collections 模块
Collections 模块
本文将简单介绍一个Python模块Collections。这个模块实现了一些很好用的数据结构,可以帮助我们解决不同的实际问题。
collections模块.png
import collections
可以通过import collections
导入该模块的方法,现在我们进入ipython3然后使用dir(collections)
查看collections下都有哪些可以用的类。
In [1]: import collections
In [2]: dir(collections)
Out[2]:
['ChainMap',
'Counter',
'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']
根据官方文档: 这个模块实现了特定目标的容器,以提供Python标准内建容器
dict
,list
,set
, 和tuple
的替代选择。
tuple的功能
tuple的功能.png
Counter
Counter是一个dict子类,可帮助计算可哈希对象的值。在其中,元素存储为字典的键,值可以为零或负值。
在下例中,我们可以找到文件单词出现的次数:
from collections import Counter
sentence = "I can because i think i can"
# Counter是一个简单的计数器,可以数组中统计字符出现的个数:
counts = Counter(sentence.split())
print(counts) # Counter({'can': 2, 'i': 2, 'I': 1, 'because': 1, 'think': 1})
Counter对象有一个elements
的方法,该方法在元素上返回迭代次数超过元素计数的迭代器。元素以任意顺序返回。
In [7]: c = Counter(a=4, b=2, c=0, d=-2)
In [8]: list(c.elements())
Out[8]: ['a', 'a', 'a', 'a', 'b', 'b']
most_common
是一种返回最常见元素及其计数(从最常见到最小)的方法。
In [9]: Counter('this is a test sentence').most_common(3)
Out[9]: [('t', 4), ('s', 4), (' ', 4)]
defaultdict
defaultdict是类似于字典的对象,它提供字典提供的所有方法,但将第一个参数(default_factory)作为字典的默认数据类型。使用defaultdict比使用dict.set_default方法执行相同操作更快。
>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
... d[k].append(v)
...
>>> d.items()
dict_items([('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])])
在该示例中,即使defaultdict对象中没有键,您也可以看到它会自动创建一个空列表。list.append然后有助于将值附加到列表中。
使用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'
nametuple
命名元组有助于了解元组中每个位置的含义,并允许我们以更好的可读性和自记录代码进行编码。您可以在使用元组的任何地方使用它们。在示例中,我们将创建一个命名元组以显示点的保留信息。
Named tuple
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y']) # Defining the namedtuple
>>> p = Point(10, y=20) # Creating an object
>>> p
Point(x=10, y=20)
>>> p.x + p.y
30
>>> p[0] + p[1] # Accessing the values in normal way
30
>>> x, y = p # Unpacking the tuple
>>> x
10
>>> y
20
deque
deque就是我们数据结构中听说的双端队列,Python已经帮我实现了这个功能。
使用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(),这样就可以非常高效地往头部添加或删除元素。
OrderedDict
顾名思义,有序字典。当我们使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持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
>>> od.keys() # 按照插入的Key的顺序返回
['z', 'y', 'x']
ChainMap
3.3 新版功能.
一个 ChainMap
类是为了将多个映射快速的链接到一起,这样它们就可以作为一个单元处理。它通常比创建一个新字典和多次调用 update()
要快很多。
站在巨人的肩膀上:
-
collections
--- 容器数据类型 - 免费视频课--python必学模块-collections
- CVE-2015-0235:Linux glibc高危漏洞的检测及修复方法
- zabbix监控在lnmp环境下编译安装小记
- 【重磅】百度开源分布式深度学习平台,挑战TensorFlow (教程)
- WordPress评论ajax动态加载,解决静态缓存下评论不更新问题
- WordPress显示访客UA信息:Show UserAgent纯代码轻度汉化版
- WordPress开启颜色评论但不造成XSS漏洞的小方法
- WordPress强迫症技巧:让文章(ID)地址完美连续(障眼法)
- iOS内存管理:从MRC到ARC实践
- MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed
- PHP跨站脚本攻击(XSS)漏洞修复方法(一)
- Windows下获取网络连线实际名称,加强IP类设置脚本的兼容性
- Android APP 快速 Pad 化实现
- PHP彩蛋还是漏洞?expose_php彩蛋的触发和屏蔽方法
- 深入源码探索 ReactNative 通信机制
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- BFE.dev前端刷题 23. 实现一个sum()方法
- 彻底深刻理解js原型链之prototype,proto以及constructor(一)
- SAP Spartacus取cart的HTTP请求
- 记一次Netty连接池FixedChannelPool连接未释放问题的排查总结
- 神经网络中的蒸馏技术,从Softmax开始说起
- NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
- Angular module加载的原理研究
- NullInjectorError No provider for EffectsRootModule!
- Web 中文字体性能优化实践
- Java反射到底慢在哪?不看后悔
- win10 edge 打开闪退问题
- dotnet Open XML 如何判断一份 Office 文档是否被加密
- 【项目实战】ETL 数据导入
- asp dotnet core 记一次应用拒绝响应调试 开启线程等待同步用光线程池