聊聊Python的一个内置模块Collections(探索Python内置模块Collections:实用功能全解析)

原创
ithorizon 7个月前 (10-19) 阅读数 30 #后端开发

探索Python内置模块Collections:实用功能全解析

一、概述

Python的内置模块Collections提供了许多扩展了内建容器类型(如dict、list、set和tuple)的特殊容器数据类型。这些数据类型在处理特定类型的任务时,可以提供更高效、更便捷的方法。本文将详细介绍Collections模块中的各个数据类型及其使用方法。

二、Counter

Counter是一个字典子类,用于计数可哈希对象。它是一个集合,其中元素存储为字典的键,它们的计数存储为字典的值。

from collections import Counter

# 示例数据

data = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana']

# 创建Counter对象

counter = Counter(data)

# 输出导致

print(counter)

# 输出: Counter({'banana': 3, 'apple': 2, 'orange': 1})

三、defaultdict

defaultdict是另一个字典子类,它允许你指定一个默认工厂函数,当访问字典中不存在的键时,会自动创建该键并使用工厂函数初始化其值。

from collections import defaultdict

# 定义一个defaultdict,其默认工厂函数为int

dd = defaultdict(int)

# 添加元素

dd['apple'] += 1

dd['banana'] += 2

dd['orange'] += 1

# 访问不存在的键

print(dd['grape'])

# 输出: 0

# 输出导致

print(dict(dd))

# 输出: {'apple': 1, 'banana': 2, 'orange': 1, 'grape': 0}

四、OrderedDict

OrderedDict是一个字典子类,它维护了元素添加的顺序。在Python 3.7+中,普通字典也保持了插入顺序,但OrderedDict仍然有一些特有的功能。

from collections import OrderedDict

# 创建一个OrderedDict

od = OrderedDict()

od['apple'] = 1

od['banana'] = 2

od['orange'] = 1

# 按照元素添加顺序输出

for key, value in od.items():

print(key, value)

# 输出:

# apple 1

# banana 2

# orange 1

五、namedtuple

namedtuple是一个工厂函数,用于创建具有命名字段的元组子类。这样,你可以通过名称而不是索引来访问元组中的元素。

from collections import namedtuple

# 创建一个namedtuple

Point = namedtuple('Point', 'x y')

# 创建一个Point实例

p = Point(11, y=22)

# 访问字段

print(p.x)

# 输出: 11

print(p.y)

# 输出: 22

# 输出Point实例

print(p)

# 输出: Point(x=11, y=22)

六、deque

deque是一个双端队列,它拥护在两端迅速添加(append)和弹出(pop)元素。与list相比,deque在处理大量元素时具有更高的性能。

from collections import deque

# 创建一个deque

dq = deque(['apple', 'banana', 'orange'])

# 添加元素到队列前端

dq.appendleft('grape')

# 添加元素到队列后端

dq.append('watermelon')

# 弹出队列前端元素

print(dq.popleft())

# 输出: grape

# 输出队列后端元素

print(dq.pop())

# 输出: watermelon

# 输出当前队列

print(dq)

# 输出: deque(['apple', 'banana', 'orange'])

七、ChainMap

ChainMap是一个字典的集合,它将多个映射(字典)串联在一起,形成一个单一的映射。在查找键时,它会按照添加顺序在各个映射中查找。

from collections import ChainMap

# 创建两个字典

a = {'a': 1, 'b': 2}

b = {'b': 3, 'c': 4}

# 创建一个ChainMap

cm = ChainMap(a, b)

# 访问键

print(cm['a']) # 从a字典中查找

# 输出: 1

print(cm['b']) # 从a字典中找不到,从b字典中查找

# 输出: 3

print(cm['c']) # 从a字典中找不到,从b字典中查找

# 输出: 4

# 尝试访问不存在的键

# print(cm['d']) # 抛出KeyError异常

八、Counter与defaultdict结合使用

Counter和defaultdict可以结合使用,以创建一个计数器,当计数器遇到不存在的元素时,自动初始化其计数为0。

from collections import Counter, defaultdict

# 创建一个defaultdict,其值为Counter

dd_counter = defaultdict(Counter)

# 添加数据

dd_counter['apple']['red'] += 1

dd_counter['apple']['green'] += 2

dd_counter['banana']['yellow'] += 3

# 访问不存在的键

print(dd_counter['orange']['red'])

# 输出: 0

# 输出导致

print(dict(dd_counter))

# 输出: {'apple': Counter({'green': 2, 'red': 1}), 'banana': Counter({'yellow': 3})}

九、总结

Collections模块提供了许多实用的数据结构,它们在处理特定类型的任务时,可以大大尽或许减少损耗代码的高效能和可读性。通过本文的介绍,我们了解了Counter、defaultdict、OrderedDict、namedtuple、deque、ChainMap等数据类型的基本用法。在实际开发中,灵活运用这些数据类型,可以让我们更高效地解决问题。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门