Python进阶之-collections详解

✨前言:

Python中的collections模块提供了一些额外的数据类型:Counter、deque、OrderedDict、defaultdict、namedtuple以及在Python 3.7之后加入的ChainMap。这些数据类型补充了Python标准的内置数据类型,为不同场景提供了更优的数据结构解决方案。

✨Counter

Counter是一个用于计数的字典子类,它可以帮助我们对可哈希对象进行计数。它是一个集合,元素像字典键(key)一样存储,它们的计数存储为值。计数可以是任何整数值,包括0和负数,Counter类有点像其他语言中的bags或multisets。简单说,就是可以统计计数。

🌟用途:

用于统计元素的出现次数,非常适合于需要计数的场景。

🌟优势:

提供快速计数的方法,并且支持对计数的数学操作(如加法、减法)。

🌟方法:

update(): 添加数据到计数器。可以是可迭代对象或另一个Counter实例。
elements(): 返回一个迭代器,每个元素重复出现的次数是其计数。

🌟示例代码:

from collections import Counter

# 创建一个Counter对象
colors = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])

print(colors)  # 输出: Counter({'blue': 3, 'red': 2, 'green': 1})

# 更新计数
colors.update(['blue','red', 'green'])
print(colors)  # 输出: Counter({'blue': 4, 'red': 3, 'green': 2})

# 获取计数
print(colors['blue'])  # 输出: 4

# 访问所有元素
print(list(colors.elements())) # ['red', 'red', 'red', 'blue', 'blue', 'blue', 'blue', 'green', 'green']

✨deque

deque是双向队列,可以从两端进行添加和弹出元素,适合用于队列和栈。

🌟用途:

可以用作队列和栈,用于需要从两端进行添加和弹出数据的场景。

🌟优势:

比list提供更高效的插入和删除操作,因为deque是为这些操作设计的。

🌟方法:

append(): 从右侧添加元素
appendleft(): 从左侧添加元素
pop(): 从右侧删除元素并返回
popleft(): 从左侧删除元素并返回

🌟示例代码:

#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.05.21

from collections import deque

# 创建一个双向队列
dq = deque([1, 2, 3])

# 在右边添加元素
dq.append(4)
print(dq)  # 输出: deque([1, 2, 3, 4])

# 在左边添加元素
dq.appendleft(0)
print(dq)  # 输出: deque([0, 1, 2, 3, 4])

# 弹出右边元素
dq.pop()
print(dq)  # 输出: deque([0, 1, 2, 3])

# 弹出左边元素
dq.popleft()
print(dq)  # 输出: deque([1, 2, 3])

✨OrderedDict

OrderedDict是一个保持了它们添加顺序的字典类,不同于标准的dict,它在迭代时保持元素顺序。

🌟用途:

在需要保持插入顺序的字典时使用,比如记录信息和追踪顺序。

🌟优势:

从Python 3.7开始,标准的dict已经能够保持插入顺序,但OrderedDict仍有其它功能,如它有popitem方法能够按插入顺序弹出元素。

🌟方法:

popitem(last=True): 删除并返回最后一个插入的键值对。如果last是False,则按照FIFO顺序返回。

🌟示例代码:

#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.05.21

from collections import OrderedDict

# 创建一个OrderedDict对象
od = OrderedDict()
od['z'] = 1
od['a'] = 2
od['b'] = 3

# 迭代是按插入顺序进行的
for key in od:
    print(key, od[key])

✨defaultdict

defaultdict是字典的子类,它为字典提供了一个默认值,避免了查找不存在的键时引发的KeyError。

🌟用途:

在字典的键不存在时提供默认值,适用于需要使用字典存储数据但又想要避免检查键存在的额外步骤的场景。

🌟优势:

省去了检查键是否存在和初始化值的步骤。

🌟方法:

不需要额外的方法,当缺少键时会自动调用工厂函数创建默认值。

🌟示例代码:

#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.05.21

from collections import defaultdict

# 使用列表作为默认值
dd = defaultdict(list)
dd['dogs'].append('Rufus')
dd['dogs'].append('Kathrin')
dd['cats'].append('Mr Whiskers')

print(dd['dogs'])  # 输出: ['Rufus', 'Kathrin']
print(dd['cats'])  # 输出: ['Mr Whiskers']

✨namedtuple

namedtuple生成可以使用名字来访问元素内容的tuple子类。

🌟用途:

用于创建类似于元组的数据结构,其中的元素可以通过名称访问,适用于需要轻量级对象的场景。

🌟优势:

节省内存,访问属性更直观,并且因为它是不可变的,它是哈希的,可以作为字典的键。

🌟方法:

使用namedtuple()函数创建一个新的namedtuple子类。

🌟示例代码:

#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.05.21

from collections import namedtuple

# 创建一个namedtuple类型
Person = namedtuple('Person', 'name age')

# 创建一个Person对象
bob = Person(name='Bob', age=30)

print(bob.name)  # 输出: Bob
print(bob.age)   # 输出: 30

✨ChainMap

ChainMap类用于创建一个单一的视图以查看多个映射(字典),允许在多个字典中搜索键值,首先在第一个字典中查找,然后是第二个,依此类推。

🌟用途:

合并多个字典或映射,并创建它们的单一视图,在不同的上下文中搜索相同的键但值可能不同的场景中特别有用。

🌟优势:

无需创建新字典,节省空间;链式更新(局部修改会反映到查找中,不用修改所有字典)。

🌟方法:

new_child(): 添加新的映射到ChainMap的前面。
keys() and values(): 这些方法将反映所有

🌟示例代码:

#!/usr/bin/env python
# coding=utf-8
# Author: Summer
# Time: 2024.05.21

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain = ChainMap(dict1, dict2)

print(chain['a'])  # 1 (在dict1中找到)
print(chain['b'])  # 2 (在dict1中找到,尽管在dict2中

🌟小结:

以上就是collections的一些常用的方法,大家如果有需要的也可以看官方文档进一步了解其中的用法。
collections中文文档:
中文文档:https://docs.python.org/zh-cn/3/library/collections.html#module-collections
英文文档:https://docs.python.org/3/library/collections.html#module-collections

  • 28
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天Aileft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值