3.2字典(Dict)与集合(Set)

134 阅读3分钟

Python高效数据管理:字典与集合深度剖析

# 快速导航
config = {"数据结构": "字典", "特性": ["键值对", "快速查找"]}
unique_nums = {1, 2, 3, 5, 8}  # 集合自动去重

一、字典核心操作全解

1. 键值对基础操作

# 创建与修改
user = {"name": "Alice", "age": 28}
user["email"] = "alice@example.com"  # 添加新键
user["age"] = 29                    # 修改值

# 安全访问方法
print(user.get("phone", "N/A"))      # 输出N/A而非报错
print(user.setdefault("role", "user"))  # 设置默认值

# 删除操作对比
del user["email"]                    # 直接删除
age = user.pop("age")                # 弹出并返回值
user.clear()                         # 清空字典

2. 高级操作方法

# 合并字典的三种方式
defaults = {"theme": "dark", "notifications": True}
custom = {"theme": "light"}

# 方法1:update()
settings = defaults.copy()
settings.update(custom)

# 方法2:字典解包(Python 3.9+)
merged = defaults | custom

# 方法3:字典推导式
merged = {k: v for d in [defaults, custom] for k, v in d.items()}

字典操作性能对比

操作平均时间复杂度
查找元素O(1)
插入元素O(1)
删除元素O(1)
遍历所有元素O(n)

二、集合运算实战应用

1. 基础集合运算

A = {1, 2, 3, 4}
B = {3, 4, 5, 6}

print(A | B)   # 并集 {1,2,3,4,5,6}
print(A & B)   # 交集 {3,4}
print(A - B)   # 差集 {1,2}
print(A ^ B)   # 对称差集 {1,2,5,6}

2. 实际应用场景

# 用户标签系统
user1_tags = {"python", "data", "ml"}
user2_tags = {"java", "data", "web"}

# 寻找共同兴趣
common_tags = user1_tags & user2_tags

# 推荐系统应用
recommended_tags = (user1_tags | user2_tags) - common_tags

3. 性能优化技巧

# 快速去重示例
duplicates = [2,5,2,8,5,1,8,8]
unique = list(set(duplicates))  # [1,2,5,8]

# 超大数据集处理(10亿元素)
def process_big_data():
    seen = set()
    with open('bigdata.txt') as f:
        for line in f:
            element = line.strip()
            if element not in seen:
                seen.add(element)
                yield element

三、字典推导式与哈希原理

1. 字典推导式进阶

# 基本形式
squares = {x: x**2 for x in range(5)}  # {0:0, 1:1, 2:4, ...}

# 条件筛选
students = {"Alice": 89, "Bob": 62, "Charlie": 93}
passed = {name: score for name, score in students.items() if score >= 70}

# 键值反转
reverse_dict = {v: k for k, v in students.items()}

2. 哈希表原理浅析

# 哈希函数演示示例
def simple_hash(key, table_size):
    return sum(ord(c) for c in str(key)) % table_size

print(simple_hash("apple", 10))  # 输出哈希值位置

哈希表核心机制

  1. 哈希函数将键转换为整数
  2. 通过取模运算确定存储位置
  3. 处理哈希冲突(开放寻址法/链地址法)
  4. 动态扩容机制(当负载因子 > 2/3时扩容)

四、最佳实践与性能指南

  1. 数据结构选择原则

    • 需要键值关联 → 字典
    • 需要快速存在性检测 → 集合
    • 需要有序存储 → Python 3.7+ 字典保持插入顺序
    • 需要数学运算 → 集合
  2. 内存优化方案

# 使用__slots__优化字典空间
class OptimizedUser:
    __slots__ = ('name', 'age')  # 替代实例字典
    def __init__(self, name, age):
        self.name = name
        self.age = age
  1. 性能对比测试
import timeit

# 集合 vs 列表的成员检测
list_test = list(range(1000000))
set_test = set(list_test)

print("列表查询:", timeit.timeit('999999 in list_test', number=100, globals=globals()))
print("集合查询:", timeit.timeit('999999 in set_test', number=100, globals=globals()))

典型测试结果

  • 列表查询:约 2.3 秒
  • 集合查询:约 0.000003 秒

扩展思考

  • 如何利用字典实现LRU缓存机制?
  • 在数据序列化时如何处理不可哈希对象?
  • 当哈希冲突严重时,如何设计更优的哈希函数?
  • 字典视图对象(keys/values/items)在动态更新时的行为特性

下节预告:迭代器与生成器——解锁Python流式数据处理能力