Skip to content

Python 3 - 字典

字典是 Python 中用于存储键值对集合的基本数据结构。把它们想象成现实世界的字典,你可以通过查找一个单词(键)来找到它的定义(值)。

语法:字典用花括号 {} 括起来。每个项目都由一个 键: 值 对组成,键值对之间用逗号分隔。空字典是 {}。

# 示例字典
student = {
"name": "Zara",
"age": 7,
"class": "First",
"id": "S123"
}
empty_dict = {}

主要特点:

  • 键在字典中必须是唯一的。
  • 键必须是不可变数据类型(如字符串、数字或仅包含不可变元素的元组)。列表或其他字典不能作为键。
  • 值可以是任何数据类型(数字、字符串、列表、其他字典等),并且不需要是唯一的。
  • 顺序 (Python 3.7+): 标准 Python 字典保留项目插入的顺序。在 Python 3.7 之前,字典是无序的。

使用方括号 [] 访问与键关联的值:

#!/usr/bin/env python3
student = {
'name': 'Zara',
'age': 7,
'class': 'First'
}
print(f"学生的姓名: {student['name']}")
print(f"学生的年龄: {student['age']}")

输出:

Student's Name: Zara
Student's Age: 7

KeyError:如果你尝试使用方括号访问不存在的键,Python 会引发 KeyError。

#!/usr/bin/env python3
student = {'name': 'Zara', 'age': 7}
# 这会引发 KeyError
# print(student['grade'])

使用 .get() 更安全地访问:.get(key, default) 方法提供了一种更安全的方式来访问值。如果键存在,它返回对应的值;如果未找到键,则返回指定的 default 值(如果未提供,则默认为 None)。这可以避免 KeyErrors。

#!/usr/bin/env python3
student = {'name': 'Zara', 'age': 7}
grade = student.get('grade') # 返回 None,因为 'grade' 键不存在
print(f"学生的年级: {grade}")
grade_safe = student.get('grade', 'Not Available') # 返回 'Not Available'
print(f"学生的年级 (安全): {grade_safe}")
name = student.get('name', 'Unknown') # 返回 'Zara',因为 'name' 存在
print(f"学生的姓名 (安全): {name}")

你可以使用带方括号的赋值操作来添加新的键值对或更新现有键的值:

#!/usr/bin/env python3
student = {
'name': 'Zara',
'age': 7,
'class': 'First'
}
# 更新现有条目
student['age'] = 8
# 添加新条目
student['school'] = "Central Elementary"
print(f"更新后的年龄: {student['age']}")
print(f"添加的学校: {student['school']}")
print(f"完整更新后的字典: {student}")

输出:

Updated Age: 8
Added School: Central Elementary
Full updated dictionary: {'name': 'Zara', 'age': 8, 'class': 'First', 'school': 'Central Elementary'}

使用 update():你也可以使用 update() 方法将另一个字典(或键值对的可迭代对象)合并到现有字典中。现有键的值将被覆盖。

#!/usr/bin/env python3
student = {'name': 'Zara', 'age': 8}
new_info = {'age': 9, 'city': 'New York'}
student.update(new_info)
print(f"使用 new_info 更新后: {student}")

输出:

Updated with new_info: {'name': 'Zara', 'age': 9, 'city': 'New York'}

有几种方法可以从字典中删除项目:

  • del dict[key]: 删除具有指定键的项目。如果键不存在,引发 KeyError。
  • dict.pop(key, [default]): 删除具有指定键的项目,并返回其值。如果键不存在且未提供 default,引发 KeyError。
  • dict.popitem(): 移除并返回最后插入的 (键, 值) 对(在 Python 3.7+ 中)。如果字典为空,引发 KeyError。
  • dict.clear(): 移除字典中的所有项目,使其变为空字典。
#!/usr/bin/env python3
student = {
'name': 'Zara',
'age': 9,
'class': 'First',
'city': 'New York'
}
# 使用 del
del student['city']
print(f"删除 'city' 后: {student}")
# 使用 pop
removed_age = student.pop('age')
print(f"使用 pop 删除的年龄: {removed_age}")
print(f"删除 'age' 后: {student}")
# 使用 popitem (移除最后添加的项目: 'class')
removed_item = student.popitem()
print(f"使用 popitem 删除的项目: {removed_item}")
print(f"popitem 后: {student}")
# 使用 clear
student.clear()
print(f"clear 后: {student}")
# 删除整个字典变量
student_copy = {'a': 1}
del student_copy
# 引发 NameError: 名称 'student_copy' 未定义
# print(student_copy)

请记住关于字典键的两个关键点:

  1. 唯一性: 键必须是唯一的。如果你为一个已存在的键赋值,旧值将被替换。
  2. 不可变性: 键必须是不可变类型(例如,字符串、数字、仅包含不可变元素的元组)。你不能使用列表或其他字典作为键,因为它们是可变的(可以在原地更改)。
#!/usr/bin/env python3
# 重复键示例 (最后一次赋值生效)
dict_dup = {'name': 'Zara', 'age': 7, 'name': 'Manni'}
print(f"重复键示例: {dict_dup}") # 输出: {'name': 'Manni', 'age': 7}
# 不可变键示例 (元组作为键)
location_counts = {('New York', 'NY'): 150, ('Los Angeles', 'CA'): 200}
print(f"元组作为键: {location_counts[('New York', 'NY')]}")
# 尝试使用可变键 (列表) - 引发 TypeError
# mutable_key_dict = {['user']: 'data'} # TypeError: unhashable type: 'list'

Python 提供了有用的内置函数和字典方法:

内置函数:

  • len(dict): 返回字典中的键值对数量。
  • str(dict): 返回字典的可打印字符串表示。
  • type(variable): 返回变量的类型(例如,<class 'dict'>)。

字典方法:

方法描述
dict.clear()移除字典中的所有项目。
dict.copy()返回字典的 浅 拷贝。对拷贝中可变值进行的更改可能会影响原字典。
dict.fromkeys(seq, [value])创建一个新字典,其键来自 seq,所有值设为 value(默认为 None)。
dict.get(key, [default])如果 key 存在,返回其对应的值,否则返回 default(或 None)。不会引发 KeyError。
key in dict (操作)如果 key 存在于字典中,返回 True,否则返回 False。(替代了旧的 has_key 方法)。
dict.items()返回一个 视图对象,显示字典的 (键, 值) 元组对列表。对字典的更改会反映在视图中。
dict.keys()返回一个 视图对象,显示字典的键列表。
dict.values()返回一个 视图对象,显示字典的值列表。
dict.pop(key, [default])移除指定的键并返回对应的值。如果键未找到,且指定了 default,则返回 default,否则引发 KeyError。
dict.popitem()移除并返回最后插入的 (键, 值) 对作为元组 (Python 3.7+)。如果字典为空,引发 KeyError。
dict.setdefault(key, [default])如果 key 在字典中,返回其值。如果不在,则插入 key,值为 default(或 None),并返回 default。
dict.update(other_dict)用 other_dict 中的键值对更新字典,覆盖现有键。

使用视图的示例:

#!/usr/bin/env python3
student = {'name': 'Zara', 'age': 9, 'class': 'First'}
keys_view = student.keys()
values_view = student.values()
items_view = student.items()
print(f"键: {keys_view}") # 输出: dict_keys(['name', 'age', 'class'])
print(f"值: {values_view}") # 输出: dict_values(['Zara', 9, 'First'])
print(f"项目: {items_view}") # 输出: dict_items([('name', 'Zara'), ('age', 9), ('class', 'First')])
# 视图反映更改
student['id'] = 'S123'
print(f"添加 ID 后的键: {keys_view}")
# 如果需要,将视图转换为列表
key_list = list(student.keys())
print(f"键列表: {key_list}")