Python快速学习——第6章:字典

4 阅读6分钟

第六章:字典

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+ 中保持插入顺序。
  • 字典常用于配置存储、计数器、缓存、查找表等场景。