defaultdict、Counter和deque是Python collections模块中高效处理数据分组、计数和双端操作的工具。defaultdict通过自动初始化缺失键提升代码简洁性与效率;Counter专用于可哈希对象的频率统计,提供most_common等便捷方法,适合大数据计数但需注意内存消耗;deque实现O(1)复杂度的双端添加删除,相比list在频繁首尾操作时性能优势显著,尤其适用于队列、栈和滑动窗口场景。三者均能显著提升代码Pythonic程度与执行效率。

Python的
collections
defaultdict
Counter
deque
解决方案
在实际开发中,我们经常会遇到需要对数据进行分组、计数或管理有序集合的场景。
collections
defaultdict
设想一下,你正在处理一个数据集,需要将所有拥有相同属性的项归类到一起。如果用普通的字典,每次往一个可能还不存在的键里添加值时,你都得先检查这个键是否存在,如果不存在就得先初始化一个空列表(或集合等),代码看起来会有点啰嗦。
from collections import defaultdict
# 场景:根据水果的颜色进行分类
fruits_by_color_normal = {}
fruit_list = [("apple", "red"), ("banana", "yellow"), ("grape", "purple"), ("strawberry", "red")]
for fruit, color in fruit_list:
if color not in fruits_by_color_normal:
fruits_by_color_normal[color] = []
fruits_by_color_normal[color].append(fruit)
print(f"普通字典分类结果: {fruits_by_color_normal}")
# 使用 defaultdict,代码会简洁很多
fruits_by_color_default = defaultdict(list) # 这里的list是工厂函数,当键不存在时会调用它创建一个空列表
for fruit, color in fruit_list:
fruits_by_color_default[color].append(fruit)
print(f"defaultdict分类结果: {fruits_by_color_default}")
# defaultdict 也可以用于计数
word_counts = defaultdict(int) # 默认值是0
text = "hello world hello python"
for word in text.split():
word_counts[word] += 1
print(f"defaultdict计数结果: {word_counts}")defaultdict
list
int
set
Counter
如果你需要统计某个序列中元素出现的频率,
Counter
from collections import Counter
# 统计列表中元素的频率
data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
fruit_counts = Counter(data)
print(f"水果计数: {fruit_counts}") # Counter({'apple': 3, 'banana': 2, 'orange': 1})
# 统计字符串中字符的频率
char_counts = Counter("programming")
print(f"字符计数: {char_counts}") # Counter({'r': 2, 'g': 2, 'p': 1, 'o': 1, 'a': 1, 'm': 1, 'i': 1, 'n': 1})
# `most_common()` 方法非常实用,可以找出出现频率最高的N个元素
top_2_fruits = fruit_counts.most_common(2)
print(f"出现频率最高的前2种水果: {top_2_fruits}") # [('apple', 3), ('banana', 2)]
# `update()` 方法可以增量更新计数
more_data = ['grape', 'apple', 'grape']
fruit_counts.update(more_data)
print(f"更新后的水果计数: {fruit_counts}") # Counter({'apple': 4, 'banana': 2, 'grape': 2, 'orange': 1})
# 也可以进行简单的集合操作,比如找出共同的元素(交集)
c1 = Counter('aabbc')
c2 = Counter('abbcd')
print(f"交集: {c1 & c2}") # Counter({'a': 1, 'b': 2, 'c': 1})Counter
deque
deque
deque
list
from collections import deque
# 创建一个deque
d = deque(['a', 'b', 'c'])
print(f"初始deque: {d}")
# 从右端添加元素
d.append('d')
print(f"append 'd': {d}") # deque(['a', 'b', 'c', 'd'])
# 从左端添加元素
d.appendleft('z')
print(f"appendleft 'z': {d}") # deque(['z', 'a', 'b', 'c', 'd'])
# 从右端删除元素
right_item = d.pop()
print(f"pop() '{right_item}', deque: {d}") # deque(['z', 'a', 'b', 'c'])
# 从左端删除元素
left_item = d.popleft()
print(f"popleft() '{left_item}', deque: {d}") # deque(['a', 'b', 'c'])
# 固定大小的deque(滑动窗口)
fixed_size_history = deque(maxlen=3)
fixed_size_history.append(1)
fixed_size_history.append(2)
fixed_size_history.append(3)
print(f"固定大小deque: {fixed_size_history}") # deque([1, 2, 3], maxlen=3)
fixed_size_history.append(4) # 当添加新元素时,最老的元素会被自动移除
print(f"添加4后: {fixed_size_history}") # deque([2, 3, 4], maxlen=3)
# 旋转操作
d_rotate = deque([1, 2, 3, 4, 5])
d_rotate.rotate(1) # 向右旋转1位
print(f"右旋1位: {d_rotate}") # deque([5, 1, 2, 3, 4])
d_rotate.rotate(-2) # 向左旋转2位
print(f"左旋2位: {d_rotate}") # deque([2, 3, 4, 5, 1])deque
appendleft()
popleft()
insert(0, item)
pop(0)
deque
defaultdict
从表面上看,
defaultdict
dict
defaultdict
当你使用普通字典时,每次尝试访问或修改一个可能不存在的键时,你都需要一个显式的
if key not in dict:
# 普通字典处理
data_groups = {}
for item in some_list:
key = get_key(item)
if key not in data_groups:
data_groups[key] = []
data_groups[key].append(item)而
defaultdict
# defaultdict 处理
from collections import defaultdict
data_groups = defaultdict(list)
for item in some_list:
key = get_key(item)
data_groups[key].append(item)显然,
defaultdict
defaultdict
list()
只有在极度性能敏感的场景,且你确定绝大多数键都已存在,或者你明确希望在键不存在时抛出
KeyError
defaultdict
Counter
Counter
优势:
Counter
Counter(my_list)
most_common()
update()
elements()
潜在陷阱:
Counter
Counter
Counter
Counter
update()
Counter.update()
update()
c = Counter({'a': 1})
c.update({'a': 5}) # 此时 'a' 的计数会变成 1 + 5 = 6
print(c) # Counter({'a': 6})
# 如果想覆盖,需要 c['a'] = 5Counter
总的来说,
Counter
deque
在Python中,我们确实可以用列表(
list
queue
stack
append()
pop()
append()
pop(0)
deque
deque
两端操作的效率:
list
append()
pop()
insert(0, item)
pop(0)
deque
append()
appendleft()
pop()
popleft()
deque
deque
固定大小功能(maxlen
deque
maxlen
del my_list[0]
内存效率(在某些操作下):
deque
总结:
list
my_list[index]
list
deque
deque
maxlen
以上就是如何使用collections模块中的常用数据结构(defaultdict, Counter, deque)?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号