Python中的Collections库

server/2025/3/14 16:46:16/

目录

  1. defaultdict:默认值字典
  2. Counter:计数器
  3. deque:双端队列
  4. namedtuple:命名元组
  5. OrderedDict:有序字典
  6. ChainMap:链式字典
  7. UserDict/UserList/UserString:自定义容器基类

1. defaultdict:默认值字典

特性
  • 自动处理缺失键:当访问不存在的键时,返回预定义的默认值(如 intlist)。
  • 底层实现:继承自 dict,通过 default_factory 参数指定默认值生成函数。
实际场景
  • 统计元素频率
    python">from collections import defaultdict
    words = ["apple", "banana", "apple"]
    word_count = defaultdict(int)
    for word in words:word_count[word] += 1  # 无需检查键是否存在
    
  • 分组数据
    python">students = [("Alice", 90), ("Bob", 85), ("Alice", 95)]
    grouped = defaultdict(list)
    for name, score in students:grouped[name].append(score)  # 自动创建列表
    
面试问题
  • Q: defaultdict 和普通 dictget(key, default) 有何区别?
    A: defaultdict 的默认值在键不存在时会被自动创建并存储,而 get() 不会修改字典。

2. Counter:计数器

特性
  • 高效统计:快速计算可哈希对象(如字符串、列表)中元素的频率。
  • 丰富接口:支持 most_common(n)update() 等方法。
实际场景
  • 分析日志数据:统计访问量最高的 IP 地址:
    python">from collections import Counter
    logs = ["192.168.1.1", "192.168.1.2", "192.168.1.1"]
    ip_count = Counter(logs)
    top_ips = ip_count.most_common(2)  # [('192.168.1.1', 2), ...]
    
  • 合并统计结果
    python">counter1 = Counter(a=3, b=1)
    counter2 = Counter(a=1, b=2)
    combined = counter1 + counter2  # Counter({'a':4, 'b':3})
    
面试问题
  • Q: 如何用 Counter 找出两个字符串是否为变位词(Anagram)?
    A: 比较 Counter(s1) == Counter(s2)

3. deque:双端队列

特性
  • 高效操作:首尾插入/删除的时间复杂度为 O(1)。
  • 线程安全:支持多线程环境下的高效操作。
实际场景
  • 实现滑动窗口算法
    python">from collections import deque
    def sliding_window(nums, k):window = deque()for num in nums[:k]:window.append(num)yield list(window)for num in nums[k:]:window.popleft()window.append(num)yield list(window)
    
  • 处理实时数据流:保留最近 N 条记录:
    python">data_stream = deque(maxlen=100)  # 自动丢弃旧数据
    
面试问题
  • Q: dequelist 在首部插入的性能差异?
    A: dequeappendleft() 是 O(1),而 list.insert(0, x) 是 O(n)。

4. namedtuple:命名元组

特性
  • 代码可读性:为元组的每个位置赋予字段名,类似轻量级类。
  • 内存高效:与普通元组内存占用相同。
实际场景
  • 处理数据库查询结果
    python">from collections import namedtuple
    User = namedtuple("User", ["id", "name", "email"])
    row = (1, "Alice", "alice@example.com")
    user = User(*row)
    print(user.name)  # "Alice"
    
  • 替代字典存储配置
    python">Config = namedtuple("Config", ["host", "port"])
    config = Config(host="localhost", port=8080)
    
面试问题
  • Q: 何时使用 namedtuple 而不是普通类?
    A: 当需要不可变数据、轻量级结构且无需方法时。

5. OrderedDict:有序字典

特性
  • 插入顺序保留:Python 3.7+ 后普通 dict 也支持,但 OrderedDict 提供额外方法(如 move_to_end)。
实际场景
  • 实现 LRU 缓存
    python">from collections import OrderedDict
    class LRUCache:def __init__(self, capacity):self.cache = OrderedDict()self.capacity = capacitydef get(self, key):if key not in self.cache:return -1self.cache.move_to_end(key)return self.cache[key]def put(self, key, value):if key in self.cache:self.cache.move_to_end(key)self.cache[key] = valueif len(self.cache) > self.capacity:self.cache.popitem(last=False)
    
面试问题
  • Q: Python 3.7+ 的普通 dict 已经有序,为何还需要 OrderedDict
    A: OrderedDict 提供 move_to_end() 等特有方法。

6. ChainMap:链式字典

特性
  • 多字典视图:将多个字典合并为一个逻辑视图,按顺序查找键。
实际场景
  • 管理配置优先级(如默认配置 < 环境配置 < 用户配置):
    python">from collections import ChainMap
    defaults = {"host": "localhost", "port": 8080}
    user_config = {"port": 9090}
    config = ChainMap(user_config, defaults)
    print(config["port"])  # 9090(用户配置优先)
    
面试问题
  • Q: ChainMap 和合并多个字典({**d1, **d2})有何区别?
    A: ChainMap 是逻辑视图,不修改原字典;合并字典会创建新对象。

7. UserDict/UserList/UserString:自定义容器基类

特性
  • 安全继承:比直接继承内置类型更灵活,避免覆盖原生方法的问题。
  • 封装数据:通过 self.data 属性访问底层数据。
实际场景
  • 自定义字典的 JSON 序列化逻辑
    python">from collections import UserDict
    class SafeDict(UserDict):def __setitem__(self, key, value):if not isinstance(key, str):raise TypeError("Key must be a string")super().__setitem__(key, value)
    
面试问题
  • Q: 为何推荐使用 UserDict 而不是直接继承 dict
    A: 直接继承 dict 时,某些方法(如 update())可能绕过重写的逻辑。

若有错误与不足请指出,关注DPT一起进步吧!!!


http://www.ppmy.cn/server/174930.html

相关文章

【C++标准库类型】深入理解C++中的using声明:从基础到实践

目录 一、using声明基础 1.1 基本语法形式 1.2 典型应用场景 1.3 作用域规则 二、关键注意事项 2.1 命名冲突处理 2.2 头文件使用规范 2.3 与typedef的对比 三、面向对象中的应用 3.1. 解除派生类名称隐藏&#xff08;核心应用&#xff09; 3.2. 构造函数继承&#…

基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现

标题:基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现 一、方案设计原理 异构特征工程 静态特征:基于AST的代码属性图(CPG)解析(使用Joern+NetworkX)动态特征:内存访问模式分析(通过QEMU模拟执行)上下文特征:CWE漏洞模式匹配(集成Semgrep规则引…

使用1Panel一键搭建WordPress网站的详细教程(全)

嘿&#xff0c;各位想搭建自己网站的朋友们&#xff01;今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话&#xff0c;我之前对服务器运维一窍不通&#xff0c;但通过这次尝试&#xff0c;我发现原来建站可以这么简单&#xff01;下面是我的亲身经历和一些小技巧…

mysql经典试题共34题

1、准备数据 -- drop drop table if exists dept; drop table if exists emp; drop table if exists salgrade;-- CREATE CREATE TABLE dept (deptno int NOT NULL COMMENT 部门编号,dname varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMM…

【H2O2 | 软件开发】Axios发送Http请求

目录 前言 开篇语 准备工作 正文 概念 封装工具包 示例 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮助。 如…

概率论的基本知识

逆概率还不懂&#xff0c;改天再想想。 联合概率 联合概率&#xff08;Joint Probability&#xff09; 是概率论中的一个重要概念&#xff0c;用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。

Python编程中常见的10个案例

文章目录 1. Hello, World!2. 计算斐波那契数列3. 文件读写4. 列表推导式5. 异常处理6. 函数定义与调用7. 类和对象8. 使用模块9. 网络请求10. 数据可视化总结 1. Hello, World! 这是学习任何编程语言时的第一个程序。 代码示例 print("Hello, World!")2. 计算斐波…

请简述一下String、StringBuffer和“equals”与“==”、“hashCode”的区别和使用场景

在 Java 中&#xff0c;String 和 StringBuffer 是两种不同的字符串处理类&#xff0c;而 equals() 方法和 操作符、hashCode() 方法在字符串比较和哈希表操作中有不同的用途和语义。以下是它们的区别和使用场景的详细说明&#xff1a; 1. String 和 StringBuffer 的区别 1.1…