第六章:字典
6.1 什么是字典?
字典就像 一本活的通讯录,每个联系人都对应一个电话号码。在字典中,我们通过“键”来查找对应的“值”,而不是通过位置索引。字典用花括号 {} 创建,每个键值对用冒号 : 分隔。
# 创建一个字典。
person = {"name": "张三", "age": 20, "city": "北京"};
# 访问字典中的值。
print(person["name"]); # 张三。
print(person["age"]); # 20。
6.2 字典的创建方式
字典可以用多种方式创建:
# 直接使用花括号。
student = {"name": "李四", "score": 95, "grade": "A"};
# 使用dict()函数。
teacher = dict(name="王老师", subject="数学", age=35);
print(teacher); # {'name': '王老师', 'subject': '数学', 'age': 35}。
# 使用列表的元组对。
pairs = [("name", "赵六"), ("age", 22), ("city", "上海")];
person = dict(pairs);
print(person); # {'name': '赵六', 'age': 22, 'city': '上海'}。
# 创建空字典。
empty_dict = {};
empty_dict2 = dict();
# 使用字典推导式。
squares = {x: x**2 for x in range(1, 6)};
print(squares); # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}。
6.3 字典的基本操作
6.3.1 访问字典中的值
通过键来访问对应的值:
person = {"name": "张三", "age": 20, "city": "北京"};
print(person["name"]); # 张三。
print(person["age"]); # 20。
# 如果键不存在,会报错。
# print(person["gender"]); # KeyError!
# 使用get()方法安全访问(键不存在时返回None或默认值)。
print(person.get("gender")); # None。
print(person.get("gender", "未知")); # 未知。
6.3.2 添加和修改键值对
person = {"name": "张三", "age": 20};
# 添加新的键值对。
person["city"] = "北京";
print(person); # {'name': '张三', 'age': 20, 'city': '北京'}。
# 修改已有的键值对。
person["age"] = 21;
print(person); # {'name': '张三', 'age': 21, 'city': '北京'}。
6.3.3 删除键值对
person = {"name": "张三", "age": 20, "city": "北京", "gender": "男"};
# del - 删除指定键。
del person["city"];
print(person); # {'name': '张三', 'age': 20, 'gender': '男'}。
# pop() - 删除并返回指定键的值。
age = person.pop("age");
print(age); # 20。
print(person); # {'name': '张三', 'gender': '男'}。
# popitem() - 删除并返回最后插入的键值对(Python 3.7+ 保留插入顺序)。
last_item = person.popitem();
print(last_item); # ('gender', '男')。
print(person); # {'name': '张三'}。
# clear() - 清空字典。
person.clear();
print(person); # {}。
6.3.4 字典长度
使用 len() 获取字典中键值对的数量:
person = {"name": "张三", "age": 20, "city": "北京"};
print(len(person)); # 3。
6.3.5 检查键是否存在
使用 in 关键字检查键是否在字典中:
person = {"name": "张三", "age": 20};
print("name" in person); # True。
print("salary" in person); # False。
6.4 字典的常用方法
6.4.1 获取所有键、值、键值对
person = {"name": "张三", "age": 20, "city": "北京"};
# keys() - 获取所有键。
print(person.keys()); # dict_keys(['name', 'age', 'city'])。
# values() - 获取所有值。
print(person.values()); # dict_values(['张三', 20, '北京'])。
# items() - 获取所有键值对(元组形式)。
print(person.items()); # dict_items([('name', '张三'), ('age', 20), ('city', '北京')])。
# 转换为列表。
keys_list = list(person.keys());
print(keys_list); # ['name', 'age', 'city']。
6.4.2 update() 方法
合并另一个字典或键值对序列到当前字典:
person = {"name": "张三", "age": 20};
# 合并另一个字典。
extra = {"city": "北京", "age": 21};
person.update(extra);
print(person); # {'name': '张三', 'age': 21, 'city': '北京'}。
# 使用关键字参数。
person.update(gender="男", height=175);
print(person); # {'name': '张三', 'age': 21, 'city': '北京', 'gender': '男', 'height': 175}。
6.4.3 setdefault() 方法
如果键存在则返回其值,如果不存在则设置默认值并返回:
person = {"name": "张三"};
# 键存在时,返回原值,不修改。
name = person.setdefault("name", "李四");
print(name); # 张三。
print(person); # {'name': '张三'}。
# 键不存在时,设置默认值。
city = person.setdefault("city", "北京");
print(city); # 北京。
print(person); # {'name': '张三', 'city': '北京'}。
6.4.4 fromkeys() 方法
创建一个新字典,从序列中提取键,所有键对应同一个默认值:
# 创建键序列。
keys = ["name", "age", "city"];
# 所有键使用相同的默认值。
default_dict = dict.fromkeys(keys, "未知");
print(default_dict); # {'name': '未知', 'age': '未知', 'city': '未知'}。
# 不指定默认值时,默认值为None。
empty_default = dict.fromkeys(keys);
print(empty_default); # {'name': None, 'age': None, 'city': None}。
6.5 字典的遍历
6.5.1 遍历键
person = {"name": "张三", "age": 20, "city": "北京"};
# 直接遍历字典(默认遍历键)。
for key in person:
print(f"{key}: {person[key]}");
# 使用keys()方法显式遍历键。
for key in person.keys():
print(key);
运行结果:
name: 张三
age: 20
city: 北京
name
age
city
6.5.2 遍历值
person = {"name": "张三", "age": 20, "city": "北京"};
for value in person.values():
print(value);
运行结果:
张三
20
北京
6.5.3 遍历键值对
person = {"name": "张三", "age": 20, "city": "北京"};
for key, value in person.items():
print(f"{key} -> {value}");
运行结果:
name -> 张三
age -> 20
city -> 北京
6.6 字典的嵌套
字典可以嵌套使用,即字典中的值可以是另一个字典、列表等:
# 学生信息字典,每个学生的信息又是一个字典。
students = {
"1001": {"name": "张三", "age": 20, "scores": [85, 90, 88]},
"1002": {"name": "李四", "age": 21, "scores": [92, 87, 95]},
"1003": {"name": "王五", "age": 19, "scores": [78, 85, 80]}
};
# 访问嵌套数据。
print(students["1001"]["name"]); # 张三。
print(students["1002"]["scores"][1]); # 87 - 李四的第二门成绩。
# 添加新学生。
students["1004"] = {"name": "赵六", "age": 22, "scores": [88, 92, 90]};
# 遍历嵌套字典。
for stu_id, info in students.items():
print(f"学号:{stu_id},姓名:{info['name']},平均分:{sum(info['scores'])/len(info['scores']):.1f}");
运行结果:
学号:1001,姓名:张三,平均分:87.7
学号:1002,姓名:李四,平均分:91.3
学号:1003,姓名:王五,平均分:81.0
学号:1004,姓名:赵六,平均分:90.0
6.7 字典推导式
使用简洁的方式创建字典:
# 将列表转换为字典,列表元素作为键,索引作为值。
fruits = ["苹果", "香蕉", "橙子"];
fruit_dict = {fruit: index for index, fruit in enumerate(fruits)};
print(fruit_dict); # {'苹果': 0, '香蕉': 1, '橙子': 2}。
# 筛选条件:只保留偶数平方。
even_squares = {x: x**2 for x in range(1, 11) if x % 2 == 0};
print(even_squares); # {2: 4, 4: 16, 6: 36, 8: 64, 10: 100}。
# 交换现有字典的键和值。
original = {"a": 1, "b": 2, "c": 3};
swapped = {value: key for key, value in original.items()};
print(swapped); # {1: 'a', 2: 'b', 3: 'c'}。
6.8 字典的排序
字典在 Python 3.7+ 中保持插入顺序,但有时需要按键或值排序:
scores = {"张三": 85, "李四": 92, "王五": 78, "赵六": 96};
# 按键排序。
sorted_by_key = dict(sorted(scores.items()));
print(sorted_by_key); # {'张三': 85, '李四': 92, '王五': 78, '赵六': 96}。
# 按值排序(升序)。
sorted_by_value = dict(sorted(scores.items(), key=lambda item: item[1]));
print(sorted_by_value); # {'王五': 78, '张三': 85, '李四': 92, '赵六': 96}。
# 按值排序(降序)。
sorted_by_value_desc = dict(sorted(scores.items(), key=lambda item: item[1], reverse=True));
print(sorted_by_value_desc); # {'赵六': 96, '李四': 92, '张三': 85, '王五': 78}。
6.9 字典的合并
多种方式合并字典:
dict1 = {"a": 1, "b": 2};
dict2 = {"c": 3, "d": 4};
# 方法1:使用update()(修改原字典)。
dict1.update(dict2);
print(dict1); # {'a': 1, 'b': 2, 'c': 3, 'd': 4}。
# 方法2:使用 ** 解包(Python 3.5+,创建新字典)。
dict1 = {"a": 1, "b": 2};
dict2 = {"c": 3, "d": 4};
merged = {**dict1, **dict2};
print(merged); # {'a': 1, 'b': 2, 'c': 3, 'd': 4}。
# 方法3:使用 | 运算符(Python 3.9+)。
dict1 = {"a": 1, "b": 2};
dict2 = {"c": 3, "d": 4};
merged = dict1 | dict2;
print(merged); # {'a': 1, 'b': 2, 'c': 3, 'd': 4}。
# 合并时处理重复键(后面的覆盖前面的)。
dict3 = {"a": 10, "b": 20};
dict4 = {"b": 99, "c": 30};
merged2 = dict3 | dict4;
print(merged2); # {'a': 10, 'b': 99, 'c': 30}。
本章笔记:
- 字典是键值对的集合,通过键来访问值,而不是索引。
- 字典使用花括号创建,键和值用冒号分隔。
- 字典的键必须是不可变类型(可哈希),值可以是任意类型。
- 支持添加、修改、删除键值对,使用
in检查键是否存在。 - 常用方法:
keys()、values()、items()、get()、update()、pop()、setdefault()等。 - 可以遍历字典的键、值或键值对。
- 字典可以嵌套,形成复杂的数据结构。
- 字典推导式可以快速创建字典。
- 字典在 Python 3.7+ 中保持插入顺序。
- 字典常用于配置存储、计数器、缓存、查找表等场景。