Python 零基础教程

Python 字典 (Dictionary)

字典(Dictionaries)提供了一种使用键值对 (key-value pairs) 来存储和检索数据的方法。

与依赖数字索引来访问元素的列表或元组不同,字典使用“键”(可以是几乎任何不可变的数据类型)作为指引。这提供了一种更直观、更高效的数据管理方式,使得字典在表示现实世界的对象、配置信息和各种映射关系时非常灵活。

1. 理解字典:键值对结构

从本质上讲,字典是键值对的集合。字典中的每个“键 (key)”都是唯一的,并且与一个特定的“值 (value)”相关联。这种关联允许你通过给定的键快速找到对应的值。

1.1 键 (Keys) 与 值 (Values)

  • 键 (Keys):键是用于访问字典中值的标识符。它们必须是不可变 (immutable) 的数据类型,例如字符串、数字(整数、浮点数)和元组。这种不可变性至关重要,因为 Python 内部使用键来计算一个哈希值 (hash value),以此来定位关联的值。如果键是可变的,它的哈希值就可能改变,从而导致无法正确查找到数据。
  • 值 (Values):另一方面,值可以是任何数据类型。这包括可变类型,如列表、甚至其他字典。这种灵活性允许你在字典中存储极其复杂和嵌套的数据结构。

2. 创建字典

创建字典有几种常见的方法:

1. 使用花括号 {} 这是最常用的方法。将键值对放在花括号内,键和值之间用冒号 : 分隔,不同的键值对之间用逗号 , 分隔。

2. 使用 dict() 构造函数: 可以使用 dict() 构造函数通过关键字参数,或者通过键值对序列(如包含元组的列表)来创建字典。

# 1. 使用花括号创建字典
student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science"
}

# 2. 使用 dict() 构造函数和关键字参数创建字典
student_2 = dict(name="Bob", age=22, major="Engineering")

# 3. 使用 dict() 构造函数和元组列表创建字典
student_3 = dict([("name", "Charlie"), ("age", 19), ("major", "Mathematics")])

print(student)
print(student_2)
print(student_3)

3. 访问字典中的值

我们可以通过将对应的键放在方括号 [] 中来访问字典里的值。

student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science"
}

print(student["name"])  # 输出: Alice
print(student["age"])   # 输出: 20

安全访问的技巧: 如果尝试访问一个在字典中不存在的键,Python 会抛出 KeyError 报错。为了避免程序崩溃,建议使用 get() 方法。如果找不到键,get() 默认返回 None(或者你可以指定一个默认返回值)。

student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science"
}

print(student.get("name"))            # 输出: Alice
print(student.get("city"))            # 键不存在,输出: None
print(student.get("city", "Unknown")) # 键不存在,返回指定的默认值,输出: Unknown

4. 修改字典 (增、改、删)

字典是可变 (mutable) 的,这意味着在字典创建后,你可以随意添加、删除或修改其中的键值对。

  • 添加新的键值对: 只需使用方括号指定一个不存在的新键,并为其赋值。
  • 修改现有的值: 使用方括号指定一个已存在的键,并赋予它一个新值。
  • 删除键值对: 可以使用 del 关键字直接删除键值对,或者使用 pop() 方法(删除的同时还能获取到被删除的值)。
student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science"
}

# 添加一个新的键值对
student["city"] = "New York"
print(student) # 输出: {'name': 'Alice', 'age': 20, 'major': 'Computer Science', 'city': 'New York'}

# 修改一个已存在的值
student["age"] = 21
print(student) # 输出: {'name': 'Alice', 'age': 21, 'major': 'Computer Science', 'city': 'New York'}

# 使用 del 关键字删除键值对
del student["city"]
print(student) # 输出: {'name': 'Alice', 'age': 21, 'major': 'Computer Science'}

# 使用 pop() 方法删除键值对并获取其值
major = student.pop("major")
print(student) # 输出: {'name': 'Alice', 'age': 21}
print(major)   # 输出: Computer Science

5. 字典操作与常用内置方法

Python 提供了多个内置方法来操作字典,例如检查键的存在、检索所有的键或值,以及合并字典。

  • keys(): 返回一个包含字典中所有键的视图对象。
  • values(): 返回一个包含字典中所有值的视图对象。
  • items(): 返回一个包含字典中所有键值对(作为元组)的视图对象。
  • update(other_dict): 将另一个字典的键值对更新到当前字典中。如果键已存在,则更新其值;如果不存在,则添加新键值对。
  • clear(): 移除字典中的所有键值对,使其变成空字典。
student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science"
}

# 获取所有键
keys = student.keys()
print(keys) # 输出: dict_keys(['name', 'age', 'major'])

# 获取所有值
values = student.values()
print(values) # 输出: dict_values(['Alice', 20, 'Computer Science'])

# 获取所有键值对 (项)
items = student.items()
print(items) # 输出: dict_items([('name', 'Alice'), ('age', 20), ('major', 'Computer Science')])

# 更新字典
student.update({"city": "New York", "gpa": 3.8})
print(student) # 输出: {'name': 'Alice', 'age': 20, 'major': 'Computer Science', 'city': 'New York', 'gpa': 3.8}

# 清空字典
student.clear()
print(student) # 输出: {}

6. 字典推导式 (Dictionary Comprehension)

与列表推导式类似,字典推导式提供了一种简洁的方法来创建字典。它允许你基于一个可迭代对象生成键值对,通常还可以加上条件过滤。

基本语法:{key: value for item in iterable if condition}

# 使用字典推导式创建一个将数字映射到其平方的字典
squares = {x: x**2 for x in range(5)}
print(squares) # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 创建一个只包含偶数及其平方的字典
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

7. 实际案例与演示

字典的用途极其广泛,可以用来表示各种各样的数据结构。以下是几个实际案例:

7.1 表示配置文件

字典经常被用来存储应用程序的配置设置。每个键代表一个设置项的名称,对应的值代表该设置的内容。

config = {
    "database_host": "localhost",
    "database_port": 5432,
    "debug_mode": True,
    "log_level": "INFO"
}

print(f"数据库主机: {config['database_host']}")
print(f"调试模式: {config['debug_mode']}")

7.2 存储用户资料

可以使用字典来存储用户资料,其中每个键代表一个用户属性(如姓名、邮箱),对应的值代表具体的属性值。

user_profile = {
    "username": "johndoe",
    "email": "john.doe@example.com",
    "age": 30,
    "city": "San Francisco"
}

print(f"用户名: {user_profile['username']}")
print(f"邮箱: {user_profile['email']}")

7.3 实现一个简单的电话簿

字典非常适合用来实现电话簿,键是人的名字,值是他们的电话号码。

phonebook = {
    "Alice": "123-456-7890",
    "Bob": "987-654-3210",
    "Charlie": "555-123-4567"
}

print(f"Alice 的电话号码是: {phonebook['Alice']}")

# 添加新联系人
phonebook["David"] = "111-222-3333"

# 删除联系人
del phonebook["Bob"]
print(phonebook)