Python 字典、元组与集合的核心操作详解
字典的深入使用与关键方法
字典作为 Python 中最灵活的数据结构之一,支持键值对存储,具备丰富的内置方法。以下是一些核心操作方式。
构造与类型转换
字典可通过嵌套序列进行创建,但要求每个子元素必须包含两个项(键和值):
data = dict([['name', 'Alice'], ['age', 25]])
# 结果: {'name': 'Alice', 'age': 25}
安全访问:get 方法推荐
直接通过键访问可能引发 KeyError,建议使用 get() 方法避免异常:
user_info = {'name': 'Bob', 'role': 'dev'}
print(user_info.get('name')) # 输出: Bob
print(user_info.get('email')) # 输出: None
print(user_info.get('email', '未填写')) # 输出: 未填写
增删改操作
- 修改现有值:
user_info['role'] = 'lead' - 添加新键值对:
user_info['status'] = 'active' - 删除元素:
- 使用
del user_info['role']删除指定键 - 使用
pop('key')移除并返回值,若键不存在会报错 - 使用
popitem()弹出最后一个插入的键值对(LIFO顺序)
- 使用
批量获取信息
常用"三剑客"方法用于遍历或分析字典内容:
info = {'a': 1, 'b': 2, 'c': 3}
info.keys() # 返回视图对象: dict_keys(['a', 'b', 'c'])
info.values() # dict_values([1, 2, 3])
info.items() # dict_items([('a', 1), ('b', 2), ('c', 3)])
这些结果可用于循环迭代,例如:
for k, v in info.items():
print(f"{k}: {v}")
特殊构造方法 fromkeys
dict.fromkeys() 可快速生成默认值相同的字典:
defaults = dict.fromkeys(['host', 'port', 'user'], 'unknown')
# {'host': 'unknown', 'port': 'unknown', 'user': 'unknown'}
注意陷阱:当默认值为可变对象(如列表),所有键将共享同一引用:
shared_list = dict.fromkeys(['x', 'y', 'z'], []) shared_list['x'].append(1) # 所有键的值都会变成 [1]
条件性赋值 setdefault
仅在键不存在时设置默认值:
config = {'debug': True}
config.setdefault('timeout', 30) # 添加
config.setdefault('debug', False) # 不改变原值
# 最终: {'debug': True, 'timeout': 30}
元组的操作特性
元组是不可变序列,适用于固定数据集合。
基本操作
t = ('apple', 'banana', 'cherry', 'date')
# 索引取值
t[1] # 'banana'
# 切片(返回新元组)
t[1:3] # ('banana', 'cherry')
t[::-1] # ('date', 'cherry', 'banana', 'apple')
# 统计与查找
len(t) # 4
t.count('banana') # 1
t.index('cherry') # 2
注意事项
- 单元素元组需加逗号:
single = (42,) - 无法修改、添加或删除元素
- 一旦创建,其内容和大小均不可更改
集合的应用场景
集合主要用于去重和数学意义上的集合运算。
去重实践
利用集合无重复元素的特性清理列表:
raw_data = [1, 2, 2, 3, 3, 3, 4]
unique_data = list(set(raw_data))
# 注意:顺序可能变化
集合关系运算
假设有两个课程报名名单:
python_class = {'Alice', 'Bob', 'Charlie', 'David'}
java_class = {'Bob', 'Eve', 'Frank', 'David'}
执行常见集合操作:
| 操作 | 代码 | 结果 |
|---|---|---|
| 交集(同时报名) | python_class & java_class | {'Bob', 'David'} |
| 并集(所有报名者) | python_class | java_class | 全部五人 |
| 差集(仅报 Python) | python_class - java_class | {'Alice', 'Charlie'} |
| 对称差(只报一门) | python_class ^ java_class | {'Alice', 'Charlie', 'Eve', 'Frank'} |
| 子集判断 | python_class > java_class | False |
实战练习示例
统计元素频次并构建字典
names = ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'Alice']
frequency = {}
for name in set(names):
frequency[name] = names.count(name)
# 结果: {'Alice': 3, 'Bob': 2, 'Charlie': 1}
此模式常用于数据分析中的初步计数任务。