Python内置数据结构详解:字典、集合与推导式应用
字典:灵活的键值映射
字典是Python中一种可变容器,用于存储键值对。它基于哈希表实现,支持快速查找、插入和删除操作。使用花括号 {} 或 dict() 构造函数可以创建空字典。
基本操作
# 创建一个空字典
data = {}
# 添加键值对
data['Alice'] = 'Engineer'
data['Bob'] = 'Designer'
data[42] = 'Answer'
# 访问值
print(data['Alice']) # 输出: Engineer
# 检查键是否存在
if 'Bob' in data:
print("Found Bob")
# 删除键值对并获取其值
role = data.pop('Bob') # role = 'Designer'
# 获取所有键和值
keys = list(data.keys()) # ['Alice', 42]
values = list(data.values()) # ['Engineer', 'Answer']
# 批量更新或合并字典
updates = {'Charlie': 'Manager', 'Alice': 'Senior Engineer'}
data.update(updates)
从序列构建字典
通过 zip 函数将两个列表组合成键值对,并转换为字典:
names = ['Tom', 'Jerry', 'Spike']
roles = ['Cat', 'Mouse', 'Dog']
# 方法一:循环赋值
personnel = {}
for name, role in zip(names, roles):
personnel[name] = role
# 方法二:直接构造
personnel = dict(zip(names, roles))
键的不可变性要求
字典的键必须是可哈希类型,即不可变对象。常见合法键包括字符串、数字和只包含不可变元素的元组。
# 合法键示例
valid_key_dict = {(1, 2): "tuple key", 3.14: "pi", "name": "value"}
# 非法键会引发错误
try:
invalid = {[1, 2]: "list key"} # 抛出 TypeError
except TypeError as e:
print("无法使用列表作为键:", e)
# 检查是否可哈希
print(hash((1, 2))) # 成功返回哈希值
print(hash(frozenset([1,2]))) # frozenset 是可哈希的集合
集合:唯一元素的无序集
集合(set)是一种不重复且无序的数据结构,适合去重和数学集合运算。
# 创建集合
group_a = set([1, 2, 3, 4])
group_b = {3, 4, 5, 6} # 使用花括号
# 并集
union_set = group_a | group_b # 或 group_a.union(group_b)
# 结果: {1, 2, 3, 4, 5, 6}
# 交集
common = group_a & group_b # 或 group_a.intersection(group_b)
# 结果: {3, 4}
# 差集
diff = group_a - group_b # 在 A 中但不在 B 中
# 结果: {1, 2}
# 移除元素
group_a.discard(1) # 安全移除(不存在也不报错)
group_a.remove(2) # 移除指定元素(若不存在则抛异常)
# 判断子集关系
subset_check = {3,4}.issubset(group_b) # True
superset_check = group_a.issuperset({3}) # False
注意:集合中的元素也必须是可哈希类型,因此不能包含列表或字典。
推导式:简洁生成容器
推导式提供了一种优雅的方式,在一行代码内生成新的列表、集合或字典。
列表推导式
语法:[expression for item in iterable if condition]
words = ['hello', 'world', 'python', 'ai']
# 提取长度小于6的单词的大写形式
short_caps = [w.upper() for w in words if len(w) < 6]
# 结果: ['HELLO', 'WORLD']
集合推导式
用于生成不含重复项的结果集。
# 获取每个单词的首字母
first_letters = {word[0].lower() for word in words}
# 结果: {'h', 'w', 'p', 'a'}
字典推导式
快速构建键值映射关系。
# 将单词与其长度配对
word_length_map = {word: len(word) for word in words}
# 结果: {'hello': 5, 'world': 5, 'python': 6, 'ai': 2}
嵌套推导式
处理多层结构时特别有用,但应避免过度嵌套以保持可读性。
matrix = [[1, 2], [3, 4], [5, 6]]
# 展平二维数组
flattened = [num for row in matrix for num in row]
# 结果: [1, 2, 3, 4, 5, 6]
# 等价于以下循环逻辑:
# flattened = []
# for row in matrix:
# for num in row:
# flattened.append(num)
当涉及三层及以上嵌套时,建议改用普通循环提升代码清晰度。