Python3 字典详解
在 Python3 中,字典(Dictionary)是一种无序、可变且键唯一的数据结构,用于存储键值对(key-value pairs)。字典是 Python 中最强大的数据类型之一,广泛应用于数据处理、配置管理和算法实现等场景。以下是 Python3 字典的详细介绍:
一、字典基础
1. 定义字典
使用花括号
{}或内置函数dict()定义: # 空字典
empty_dict = {}
empty_dict = dict()
# 带键值对的字典
person = {
'name': 'Alice',
'age': 30,
'city': 'New York',
'skills': ['Python', 'Java']
}
# 使用dict()构造函数
scores = dict(math=90, english=85, science=95)
2. 字典特点
- 键唯一性:同一字典中,键必须唯一,重复的键会覆盖原有值。
- 键不可变性:键必须是不可变类型(如字符串、数字、元组),列表等可变类型不能作为键。
- 值任意性:值可以是任意类型,包括列表、字典等复合类型。
- 无序性:Python 3.7 + 中,字典保持插入顺序,但本质仍是无序的。
二、字典操作
1. 访问元素
通过键获取对应的值,若键不存在会引发
KeyError: person = {'name': 'Alice', 'age': 30}
# 直接访问
print(person['name']) # 输出: Alice
# 使用get()方法,键不存在时返回默认值
print(person.get('city', 'Unknown')) # 输出: Unknown
2. 修改和添加元素
# 修改现有键的值
person['age'] = 31
# 添加新键值对
person['job'] = 'Engineer'
# 使用update()方法批量添加/更新
person.update({'city': 'Los Angeles', 'hobbies': ['reading', 'swimming']})
3. 删除元素
# 删除指定键值对
del person['job']
# 删除并返回指定键的值
age = person.pop('age')
# 随机删除并返回一个键值对(Python 3.7+返回最后插入的)
item = person.popitem()
# 清空字典
person.clear()
三、字典遍历
1. 遍历键
for key in person.keys():
print(key)
2. 遍历值
for value in person.values():
print(value)
3. 遍历键值对
for key, value in person.items():
print(f"{key}: {value}")
四、字典方法
1. 常用方法
| 方法 | 描述 |
|---|---|
keys() |
返回包含所有键的视图对象。 |
values() |
返回包含所有值的视图对象。 |
items() |
返回包含所有键值对的视图对象。 |
get(key, default) |
返回指定键的值,若键不存在则返回默认值。 |
pop(key[, default]) |
删除指定键并返回其值,若键不存在则返回默认值(若无默认值则报错)。 |
popitem() |
随机删除并返回一个键值对(Python 3.7 + 返回最后插入的)。 |
update(other_dict) |
用另一个字典的键值对更新当前字典(存在则覆盖,不存在则添加)。 |
clear() |
清空字典所有元素。 |
copy() |
返回字典的浅拷贝。 |
2. 示例代码
# 浅拷贝示例
original = {'a': [1, 2], 'b': 3}
copy = original.copy()
original['a'].append(3)
print(copy['a']) # 输出: [1, 2, 3](浅拷贝只复制一层)
五、字典推导式
用于快速创建字典:
# 创建平方数字典
squares = {x: x**2 for x in range(5)}
# 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 筛选字典元素
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
# 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
六、嵌套字典
字典中包含字典,用于表示复杂数据结构:
employees = {
'emp1': {'name': 'Alice', 'salary': 80000},
'emp2': {'name': 'Bob', 'salary': 75000},
'emp3': {'name': 'Charlie', 'salary': 90000}
}
# 访问嵌套元素
print(employees['emp2']['name']) # 输出: Bob
# 修改嵌套元素
employees['emp3']['salary'] = 95000
七、字典排序
1. 按键排序
d = {'c': 3, 'a': 1, 'b': 2}
sorted_dict = dict(sorted(d.items()))
# 输出: {'a': 1, 'b': 2, 'c': 3}
2. 按值排序
sorted_dict = dict(sorted(d.items(), key=lambda item: item[1]))
# 输出: {'a': 1, 'b': 2, 'c': 3}
八、性能特点
字典基于哈希表实现,具有以下性能特性:
- 插入 / 删除 / 查找:平均时间复杂度为 O (1),但最坏情况下为 O (n)(哈希冲突严重时)。
- 空间效率:字典的空间开销较大,适合存储少量关键数据。
- 哈希冲突:键的哈希值相同时会发生冲突,Python 使用开放寻址法解决冲突。
九、与其他数据结构的对比
| 数据结构 | 有序性 | 可变性 | 键唯一性 | 访问方式 | 典型应用场景 |
|---|---|---|---|---|---|
| 字典 | 无序 | 可变 | 是 | 键 | 快速查找、配置管理 |
| 列表 | 有序 | 可变 | 否 | 索引 | 序列数据处理 |
| 元组 | 有序 | 不可变 | 否 | 索引 | 不可变数据存储 |
| 集合 | 无序 | 可变 | 是 | 无 | 去重、成员测试 |
十、常见应用场景
1. 数据统计
# 统计字符频率
text = "hello world"
freq = {}
for char in text:
freq[char] = freq.get(char, 0) + 1
print(freq) # 输出: {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}
2. 配置管理
config = {
'host': 'localhost',
'port': 3306,
'user': 'admin',
'password': 'secret',
'database': 'mydb'
}
# 读取配置
print(f"Connecting to {config['host']}:{config['port']}")
3. 映射转换
# 数字到中文映射
num_to_chinese = {
0: '零', 1: '一', 2: '二', 3: '三', 4: '四',
5: '五', 6: '六', 7: '七', 8: '八', 9: '九'
}
# 转换数字
print(num_to_chinese[5]) # 输出: 五
十一、总结
- 核心特性:键值对存储、键唯一且不可变、无序(3.7 + 保持插入顺序)。
- 优势:快速查找(O (1) 时间复杂度)、灵活的数据结构。
- 注意事项:避免使用可变对象作为键,大字典会占用较多内存。
字典是 Python 中最常用的数据结构之一,掌握其操作和特性对于编写高效、简洁的代码至关重要。合理使用字典可以显著提升程序的性能和可读性。
浙公网安备 33010602011771号