13 - collections模块:高级数据结构

想系统提升编程能力、查看更完整的学习路线,欢迎访问 AI Compass:https://github.com/tingaicompass/AI-Compass

仓库持续更新刷题题解、Python 基础和 AI 实战内容,适合想高效进阶的你。

13 - collections模块:高级数据结构

学习目标: 掌握Counter, defaultdict, deque


💻 代码示例

1. Counter - 计数器

python 复制代码
from collections import Counter

# 统计元素出现次数
nums = [1, 2, 2, 3, 3, 3]
count = Counter(nums)
print(count)  # Counter({3: 3, 2: 2, 1: 1})

# 统计字符
s = "hello"
char_count = Counter(s)
print(char_count)  # Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})

# 访问计数
print(count[2])  # 2
print(count[10])  # 0 (不存在返回0,不报错)

# 最常见的元素
print(char_count.most_common(2))  # [('l', 2), ('h', 1)]

# Counter运算
c1 = Counter("hello")
c2 = Counter("world")
print(c1 + c2)  # 相加
print(c1 - c2)  # 相减

2. defaultdict - 默认值字典

python 复制代码
from collections import defaultdict

# 普通字典
d = {}
# d["key"].append(1)  # ❌ KeyError

# defaultdict自动创建默认值
d = defaultdict(list)  # 默认值是list
d["key"].append(1)
d["key"].append(2)
print(d)  # {'key': [1, 2]}

# 默认值是int(用于计数)
count = defaultdict(int)
for char in "hello":
    count[char] += 1  # 不存在的键默认为0
print(dict(count))  # {'h': 1, 'e': 1, 'l': 2, 'o': 1}

# 默认值是set
groups = defaultdict(set)
groups["A"].add(1)
groups["A"].add(2)
print(dict(groups))  # {'A': {1, 2}}

3. deque - 双端队列

python 复制代码
from collections import deque

# 创建队列
q = deque([1, 2, 3])

# 右端操作(O(1))
q.append(4)       # [1, 2, 3, 4]
print(q.pop())    # 4, 队列变成[1, 2, 3]

# 左端操作(O(1))
q.appendleft(0)   # [0, 1, 2, 3]
print(q.popleft())  # 0, 队列变成[1, 2, 3]

# 作为队列(FIFO)
queue = deque()
queue.append(1)  # 入队
queue.append(2)
print(queue.popleft())  # 1 出队

# 作为栈(LIFO)
stack = deque()
stack.append(1)  # 入栈
stack.append(2)
print(stack.pop())  # 2 出栈

# 限制长度
recent = deque(maxlen=3)
for i in range(5):
    recent.append(i)
print(recent)  # deque([2, 3, 4])

🎯 在算法题中的应用

python 复制代码
# Counter: 字母异位词
from collections import Counter

def isAnagram(s, t):
    return Counter(s) == Counter(t)

# defaultdict: 分组
from collections import defaultdict

def groupAnagrams(strs):
    groups = defaultdict(list)
    for word in strs:
        key = "".join(sorted(word))
        groups[key].append(word)
    return list(groups.values())

# deque: BFS层序遍历
from collections import deque

def levelOrder(root):
    if not root:
        return []

    result = []
    queue = deque([root])

    while queue:
        level = []
        for _ in range(len(queue)):
            node = queue.popleft()
            level.append(node.val)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        result.append(level)

    return result

# deque: 滑动窗口最大值(单调队列)
def maxSlidingWindow(nums, k):
    from collections import deque
    dq = deque()
    result = []

    for i, num in enumerate(nums):
        # 移除队首过期元素
        while dq and dq[0] < i - k + 1:
            dq.popleft()

        # 移除队尾小于当前元素的
        while dq and nums[dq[-1]] < num:
            dq.pop()

        dq.append(i)

        if i >= k - 1:
            result.append(nums[dq[0]])

    return result

🎓 小结

Counter : 统计元素出现次数

defaultdict : 自动创建默认值,避免KeyError

deque: 双端队列,两端操作都是O(1)

使用场景:

  • Counter: 计数、频率统计
  • defaultdict: 分组、建图
  • deque: BFS、滑动窗口、单调队列

下一步 : 14-heapq模块.md


如果这篇内容对你有帮助,推荐收藏 AI Compass:https://github.com/tingaicompass/AI-Compass

更多系统化题解、编程基础和 AI 学习资料都在这里,后续复习和拓展会更省时间。

相关推荐
萧西待水6 小时前
奥赛一本通 1447 靶形数独
算法·深度优先
梦帮科技8 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
泯泷8 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm8 小时前
34 合并K个升序链表
javascript·算法·链表
C++ 老炮儿的技术栈9 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
Navigator_Z10 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚12 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木12 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒13 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃14 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm