Python 集合模块:Counter、ChainMap、Deque 和 Tuple
已发表: 2020-12-01Python Collections 模块提供了一组容器数据类型,这些数据类型扩展了库存容器的功能,如列表、元组、集合和字典。 使用这些特殊容器,您不仅拥有库存容器的功能,而且还拥有一些额外的方法,这些方法对于某些任务非常方便。
在本教程结束时,您将掌握以下知识:
- 什么是收藏模块?
- 各种功能,如:
- 柜台
- 链图
- 双端队列
- 命名元组
- 工作示例
Collections 模块预先安装在 Python 中,因此我们不需要 pip 安装它。 我们只需导入它,您就可以开始使用了! 让我们详细介绍最常用的功能。
向世界顶尖大学学习数据科学。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
必读:现实世界中令人着迷的 Python 应用程序
目录
柜台
Counter很容易成为 Collections 模块中最常用和最有用的功能。 Counter 是 Python 中字典类的子类。 它计算可迭代对象(如字符串、元组、列表等)中每个元素的出现次数并将其存储在字典中。 字典键是迭代中的唯一元素,值是这些元素的计数。
让我们用一些例子来尝试一下。
导入集合 Marvel = '坏金刚狼欺负可怜的钢铁侠坏金刚狼可怜可怜的钢铁侠' Marvel_count = collections.Counter(Marvel.split()) |
#输出: 计数器({ '坏' : 3 , '铁' : 2 , '男人' : 2 , '可怜' : 2 , “金刚狼” : 2 , “欺负” : 1 }) |
正如我们所看到的,它计算了每个元素的出现次数并将它们放入字典中。 这可以用于任何类型的迭代。 现在让我们看看它都有哪些方法。
Marvel_count[ '坏' ] #>> 3 Marvel_count.values() #>> dict_values([3, 2, 1, 2, 2, 2]) Marvel_count.keys() #>> dict_keys(['Bad', 'Wolverine', 'bullied', 'Iron', 'Man', 'Poor']) |
most_common(n) 方法返回按 count 降序排列的 n 个最常见元素的列表。
Marvel_count.most_common( 2 ) #>> [('坏', 3), ('金刚狼', 2)] |
链图
ChainMap用于制作多个字典的单一视图,以便可以从单一视图(即 ChainMap 对象本身)访问和更新它们。 请记住,这些 ChainMap 仅包含对实际字典的引用,并且更新也在实际字典本身中完成。
ChainMap 是字典类的扩展,因此支持所有字典方法,以及一些我们将讨论的额外方法。
dic1 = { 'a' : 1 , 'b' : 2 } dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 } chain1 = collections.ChainMap(dic2, dic1) 链1 |
在上面的代码中,我们定义了两个字典 dic1 和 dic2 并将它们放在一个 ChainMap 对象中。
#输出: ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }) |
正如我们所看到的, dic2以这个顺序与dic1 “链接” 。 本质上,您可以想象 dic2 像dic2->dic1 一样连接到 dic1。 因此,当我们搜索键“b”时,它将首先在第一个映射中搜索,即 dic2,如果未找到该键,它将转到下一个映射。
因此,ChainMap 的顺序对于确定首先搜索哪个映射很重要。 让我们看看实际情况。
链 1[ 'b' ] #>> 3 |
正如我们看到的,上面的 ChainMap 在两个字典中都有键“b”。 因此,当我们搜索键“b”时,它会在第一个映射 dic2 中搜索并返回值。
地图属性
maps属性ChainMap返回一个按搜索顺序排列的映射列表,即dic2在map中排在第一位,所以会先搜索到,以此类推。
chain1.maps #>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}] |
同样,我们可以检查键和值:
列表(chain1.keys()) #>> ['a', 'c', 'b'] |
列表(chain1.values()) #>> [1, 4, 3] |
如我们所见,仅显示唯一键和值。
new_child(m=None)
new_child() 方法用于将新地图添加到 ChainMap 中。 此方法返回一个新的 ChainMap,新地图作为第一个地图,然后是其余地图。 如果指定了 m,则它成为第一个映射,否则添加一个空字典作为第一个映射。
链 1.new_child(dic3) chain1.maps |
#输出: [{ 'b' : 9 , 'd' : 4 },{ 'b' : 3 , 'c' : 4 },{ 'a' : 1 , 'b' : 2 }] |
如我们所见,它在开头添加了 dic3 并返回了一个新的 ChainMap 对象。
反转
您可能想知道如何更改 ChainMap 的顺序。 这可以使用 reversed 函数来实现,该函数返回一个迭代器,用于反向迭代 ChainMap。 让我们看看这个在行动。
键“b”现在在所有地图中。 ChainMap 中的第一个映射的键为“b”,值为 9。
链 1[ 'b' ] #>> 9 |
让我们看看一旦我们以相反的方向迭代会发生什么。
chain1.maps = 反转(chain1.maps) 链 1[ 'b' ] #>> 2 |
请记住, reversed 函数并没有真正反转映射,它只是提供了一个反向迭代器。
阅读: Python 教程
双端队列
双端队列(发音为'deck' )是列表的扩展,但是是双端的。 Deque 代表:双端队列,因为我们可以在 Deques 的任一端有效地删除/弹出和追加元素,这与所有操作都在右侧的列表不同。

deque(iterable, maxlen)接收可迭代对象并返回双端队列对象。 它们还有一个 maxlen 参数,它决定了元素数量的上限。 如果未指定,则 deque 可以无限增长。 让我们来看看它的快捷方法。
deq = collections.deque([ 1 , 2 , 3 , 4 , 5 ], maxlen= 6 ) deq.appendleft( 8 ) |
#输出: 双端队列([ 8 , 1 , 2 , 3 , 4 , 5 ]) |
如我们所见,调用appendleft方法将元素追加到左端。 此外,由于我们已经使用 maxlen 将它初始化为 6,它现在已经达到,附加另一个元素将抛出“StopIterationError”。
所以,让我们使用popleft删除最左边的元素:
deq.popleft() #>> 8 |
我们还可以使用 remove 按值删除特定元素:
deq.remove( 5 ) #>> 双端队列([1, 2, 3, 4]) |
注意:使用不在双端队列中的元素调用 remove 方法将抛出“ValueError”。
我们可以使用insert(index, element)在指定索引处插入任何元素。
deq.insert( 2 , 7 ) #>> 双端队列([1, 2, 7, 3, 4]) |
可以通过调用reverse方法来反转双端队列。
deq.reverse() #>> 双端队列([4, 3, 7, 2, 1]) |
Deque 也可以使用rotate方法顺时针或逆时针旋转。
#顺时针deq.rotate( 2 )#>> 双端队列([2, 1, 4, 3, 7]) |
#逆时针deq.rotate( -2 )#>> 双端队列([4, 3, 7, 2, 1]) |
命名元组
namedtuple()是 Python 中常见的元组对象的一个巨大提升。 命名元组允许我们按元素的名称而不是位置来索引元素。 您可以将命名元组视为表,其中表名作为元组名,列名作为索引名。 命名元组本质上为每个元素分配了意义,以便更容易访问和更易读的代码。
让我们举一些例子来了解它是如何工作的。
Performance = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ]) |
在上面的代码中,我们定义了一个名为“Employee_Rating”的命名元组对象“Performance”,其字段名称为“Q1”、“Q2”、“Q3”和“Q4”,它将存储员工的季度评级。 让我们创建 Employee_Rating 的 2 个命名元组条目。
拉胡尔=性能( 3、4、3.5、4.5 ) _ ankit =性能( 4、4.5、4、4.5 ) _ _ _ |
#输出: Employee_Rating(Q1= 4 , Q2= 4.5 , Q3= 4 , Q4= 4.5 ) Employee_Rating(Q1= 3 , Q2= 4 , Q3= 3.5 , Q4= 4.5 ) |
现在我们已经创建了 2 个条目,我们可以通过索引名称访问它们。
ankit.Q1 #>> 4 |
ankit.Q3 > 拉胡尔.Q3 #>> 真 |
要添加新条目或创建新的命名元组对象,我们可以使用_make()方法。
Milkha = Performance._make([ 4 , 5 , 5 , 4.5 ]) 米尔哈 |
#输出: Employee_Rating(Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4.5 ) |
我们可以通过在任何命名元组上使用_replace方法来编辑元素。
rahul._replace(Q1= 2 ) |
#输出: Employee_Rating(Q1= 2 , Q2= 4 , Q3= 3.5 , Q4= 4.5 ) |
在你走之前
Collections 模块还有一些更有用的函数,例如 OrderedDict、defaultdict、UserList、UserString、UserDict。 确保您掌握了我们在本教程中讨论的功能。 这些容器类型不仅使您的生活更轻松,而且还提高了您编写的代码的质量。
如果您想了解 Python、数据科学,请查看 IIIT-B 和 upGrad 的数据科学执行 PG 计划,该计划是为在职专业人士创建的,并提供 10 多个案例研究和项目、实用的实践研讨会、与行业专家的指导,与行业导师一对一,400 多个小时的学习和顶级公司的工作协助。
什么是集合模块,它有什么用处?
Python 的集合模块支持多种类型的容器。 Container 是一个对象,用于存储各种项目并提供检索和迭代封闭对象的方法。 可以使用元组、列表、字典和更多内置容器。 此外,Collections 模块具有高度专业化和高效的容器数据类型,例如 namedtuple()、deque、OrderedDict、counter 等,远远优于标准 Python 容器。
集合模块是 Python 的必要主题吗?
是的,集合模块是学习 Python 的必备话题。 使用 Python 的集合模块可以计算对象、构建队列和堆栈、管理字典中缺失的键等等。 集合的数据类型和类被创建为高效和 Pythonic。 它们对你的 Python 编程生涯非常有价值,所以花时间学习这个集合模块非常值得你花时间和精力。 Collections 模块中的容器可能对业务级项目和模型非常有益,通过改进优化和执行速度显着增加了通用 Python 容器的实用性。
收集模块中存在哪些数据类型?
集合模块中存在多种数据类型,例如 deque、defaultdict、namedtuple、OrderedDict、Counter、ChainMap、UserDict、UserList、UserString 等。这些数据类型可用于各种原因,例如从任一在序列的末尾,为缺少的键构造默认值,并自动将它们添加到字典中。 这些数据类型还可以通过提供命名字段来提供帮助,这些字段允许按名称访问项目,同时保持按索引访问项目的能力,计算序列或可迭代中的唯一项目,以及将多个映射视为单个字典对象等。