聊聊Python的一个内置模块Collections(Python内置模块Collections详解:高效数据结构全掌握)
原创
一、简介
Python的内置模块Collections提供了许多特殊的高效数据结构,这些数据结构在处理数据时可以大大节约性能。本文将详细介绍Collections模块中的各种数据结构及其用法。
二、Counter
Counter是一个字典子类,用于计数可哈希对象。它是一个集合,其中元素存储为字典的键,它们的计数存储为字典的值。
from collections import Counter
# 示例
words = 'hello world hello world hello'.split()
counter = Counter(words)
print(counter)
# 输出:Counter({'hello': 3, 'world': 2})
Counter类提供了以下方法和属性:
- elements():返回一个迭代器,包含所有元素,每个元素重复它的计数次数。
- most_common([n]):返回一个列表,包含最常见的元素及其计数,按计数降序排列。如果指定n,则返回前n个最常见的元素。
- subtract([iterable-or-mapping]):从计数器中减去输入的可迭代对象或映射中的元素。
三、defaultdict
defaultdict是另一个字典子类,它为字典中的每个新键自动分配一个默认值。当你尝试访问字典中不存在的键时,它会自动创建该键并将其值设为默认值。
from collections import defaultdict
# 示例
d = defaultdict(int)
d['a'] += 1
d['b'] += 2
print(d)
# 输出:defaultdict(
, {'a': 1, 'b': 2})
defaultdict赞成的默认工厂函数包括:
- int:默认值为0
- str:默认值为空字符串
- list:默认值为空列表
- set:默认值为空集合
- dict:默认值为空字典
四、OrderedDict
OrderedDict是一个字典子类,它维护了元素添加的顺序。这意味着当你迭代OrderedDict时,元素的顺序将与它们被添加的顺序相同。
from collections import OrderedDict
# 示例
d = OrderedDict()
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d)
# 输出:OrderedDict([('a', 1), ('b', 2), ('c', 3)])
OrderedDict在Python 3.7+中已经被内置的dict所取代,后者也保证了元素的插入顺序。
五、ChainMap
ChainMap是一个字典类,用于将多个映射对象链接在一起,形成一个逻辑上的映射对象。它用于处理多个字典的并集。
from collections import ChainMap
# 示例
a = {'a': 1, 'b': 2}
b = {'b': 3, 'c': 4}
c = ChainMap(a, b)
print(c['a']) # 输出:1
print(c['b']) # 输出:2
print(c['c']) # 输出:4
ChainMap提供了以下方法和属性:
- maps:返回一个包含所有映射对象的列表。
- new_child():返回一个新的ChainMap对象,包含当前映射对象的副本。
六、Counter
Counter是一个计数工具,用于敏捷计数可哈希对象。Counter本质上是一个字典,键为元素,值为计数。
from collections import Counter
# 示例
c = Counter('hello world')
print(c)
# 输出:Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})
Counter提供了以下方法和属性:
- elements():返回一个迭代器,包含所有元素,每个元素重复它的计数次数。
- most_common([n]):返回一个列表,包含最常见的元素及其计数,按计数降序排列。
- subtract([iterable-or-mapping]):从计数器中减去输入的可迭代对象或映射中的元素。
七、deque
deque是一个双端队列,赞成在两端敏捷添加(append)和弹出(pop)元素。它提供了类似于列表的接口,但其在两端操作时的时间纷乱度为O(1)。
from collections import deque
# 示例
d = deque(['a', 'b', 'c'])
d.append('d')
print(d) # 输出:deque(['a', 'b', 'c', 'd'])
d.appendleft('z')
print(d) # 输出:deque(['z', 'a', 'b', 'c', 'd'])
d.pop()
print(d) # 输出:deque(['z', 'a', 'b', 'c'])
d.popleft()
print(d) # 输出:deque(['a', 'b', 'c'])
deque提供了以下方法和属性:
- append(x):在队列的右侧添加一个元素。
- appendleft(x):在队列的左侧添加一个元素。
- pop():从队列的右侧移除一个元素并返回它。
- popleft():从队列的左侧移除一个元素并返回它。
- rotate(n):旋转队列中的元素。
八、namedtuple
namedtuple是一个工厂函数,用于创建具有命名字段的元组子类。它类似于具有不可变字段的类。
from collections import namedtuple
# 示例
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(p.x) # 输出:11
print(p.y) # 输出:22
namedtuple提供了以下方法和属性:
- _fields:包含所有字段名称的元组。
- _asdict():返回一个具有相同字段名的OrderedDict。
- _replace(**kwargs):返回一个新的namedtuple实例,替换指定的字段值。
九、递归函数和默认参数
在Collections模块中,一些数据结构如defaultdict和Counter可以与递归函数和默认参数结合使用,以实现更纷乱的数据处理。
from collections import defaultdict
def add_numbers(numbers):
total = 0
for number in numbers:
if isinstance(number, list):
total += add_numbers(number)
else:
total += number
return total
# 示例
numbers = [1, 2, [3, 4, [5, 6]], 7]
print(add_numbers(numbers)) # 输出:28
十、总结
Collections模块为Python开发者提供了一系列高效的数据结构,这些数据结构在处理纷乱的数据时可以大大节约性能。通过掌握这些数据结构,我们可以编写更高效、更简洁的代码。