介绍
在 Python 中,字典(dictionary)是一个 有序的(自 Python 3.7 起)key: value 对的集合。字典用于以可变、可索引且不允许重复键的方式存储数据值。字典的主要操作是使用键存储值以及根据键提取值。
例如,你可以创建一个字典来存储关于一只猫的信息:
## 字典:键值对的集合
my_cat = {
'size': 'fat', ## 键:'size', 值:'fat'
'color': 'gray', ## 键:'color', 值:'gray'
'disposition': 'loud' ## 键:'disposition', 值:'loud'
}
在这个 Lab 中,你将学习如何创建字典、访问和修改它们的数据、遍历它们,以及使用各种实用方法来有效地操作它们。
访问和修改字典数据
在这一步,你将学习如何创建字典、添加新的键值对、更新现有键值对,以及使用下标操作符 [] 检索值。
你可以通过使用 [] 操作符为键赋一个值来添加或更新字典条目。如果键已存在,其值将被更新。如果键不存在,则会添加一个新的键值对。
注意:如果你不熟悉使用 WebIDE(类似 VS Code),请先在 这个 Lab 学习。
让我们通过创建一个文件来编写代码开始。
首先,从左侧的文件浏览器中打开位于 ~/project 目录下的 main.py 文件。
现在,将以下代码添加到 main.py 中。此代码定义了一个字典,然后向其中添加一个新的键值对。
## 使用下标操作符添加或更新字典条目
my_cat = {
'size': 'fat',
'color': 'gray',
'disposition': 'loud',
}
my_cat['age_years'] = 2 ## 添加新的键值对
print(my_cat)
要运行脚本,请打开终端并执行以下命令:
python3 main.py
你应该会在控制台中看到更新后的字典被打印出来:
{'size': 'fat', 'color': 'gray', 'disposition': 'loud', 'age_years': 2}
你也可以使用下标操作符 [] 中的键来检索值。让我们修改 main.py 文件,以访问并打印与 'size' 键相关联的值。
将 main.py 的内容替换为以下代码:
my_cat = {
'size': 'fat',
'color': 'gray',
'disposition': 'loud',
}
print(my_cat['size'])
再次运行脚本:
python3 main.py
输出将是 'size' 键的值:
fat
请注意,如果你尝试访问字典中不存在的键,Python 将会引发一个 KeyError。让我们实际看看这种情况。将 main.py 中的代码替换为:
my_cat = {
'size': 'fat',
'color': 'gray',
'disposition': 'loud',
}
print(my_cat['eye_color'])
运行脚本:
python3 main.py
这将导致一个 KeyError,因为键 'eye_color' 不存在于 my_cat 字典中。
Traceback (most recent call last):
File "/home/labex/project/main.py", line 5, in <module>
print(my_cat['eye_color'])
KeyError: 'eye_color'
为了进行验证,请将 main.py 恢复到第一个示例,即添加一个新键并打印整个字典的代码。
## 使用下标操作符添加或更新字典条目
my_cat = {
'size': 'fat',
'color': 'gray',
'disposition': 'loud',
}
my_cat['age_years'] = 2 ## 添加新的键值对
print(my_cat)
迭代字典
在这一步,你将探索遍历字典的不同方法。Python 提供了几种方法来遍历字典的键(keys)、值(values)或两者。
使用 values() 遍历值
values() 方法返回一个视图对象(view object),它显示字典中所有值的列表。你可以遍历这个对象来访问每个值。
清空 main.py 文件并添加以下代码:
## 使用 .values() 方法遍历字典值
pet = {'color': 'red', 'age': 42}
for value in pet.values(): ## 遍历所有值
print(value)
运行脚本:
python3 main.py
输出将显示每个值在新的一行:
red
42
使用 keys() 遍历键
类似地,keys() 方法返回一个包含字典键的视图对象。虽然你可以使用 pet.keys(),但直接遍历字典本身是更常见、更符合 Python 风格(Pythonic)的遍历其键的方法。
使用以下代码更新 main.py:
## 直接遍历字典会遍历键(默认行为)
pet = {'color': 'red', 'age': 42}
for key in pet: ## 等同于 for key in pet.keys()
print(key)
运行脚本:
python3 main.py
你将看到打印出的键:
color
age
使用 items() 遍历键值对
当你需要在遍历时同时获取键和值时,items() 方法非常有用。它返回一个视图对象,其中每个元素都是一个 (key, value) 元组(tuple)。
更新 main.py 以使用 items():
## 使用 .items() 方法遍历键值对
pet = {'color': 'red', 'age': 42}
for key, value in pet.items(): ## 将元组解包(unpack)为 key 和 value
print(f'Key: {key} Value: {value}')
在这里,我们在每次迭代中使用了元组解包(for key, value in ...),将元组的第一个元素赋值给 key,第二个元素赋值给 value。
运行脚本:
python3 main.py
输出将是格式化后的字符串,显示每个键值对:
Key: color Value: red
Key: age Value: 42
安全访问和添加条目
在这一步,你将学习如何安全地检索值而不会导致 KeyError,以及如何有条件地添加条目。
使用 get() 安全地访问
如你在第 1 步中看到的,尝试使用 [] 访问不存在的键会引发 KeyError。get() 方法提供了一种更安全的方式来访问键。如果键存在,它返回该键的值;如果不存在,它返回 None 而不是引发错误。
清空 main.py 并添加以下代码:
## .get() 方法:安全地检索值,如果键不存在则返回 None
wife = {'name': 'Rose', 'age': 33}
print(f'My wife name is {wife.get("name")}')
print(f'She is deeply in love with {wife.get("husband")}')
运行脚本:
python3 main.py
输出显示 get() 为 'name' 返回了值,为缺失的键 'husband' 返回了 None:
My wife name is Rose
She is deeply in love with None
你也可以向 get() 提供一个默认值作为第二个参数。如果找不到键,将返回该默认值。
修改 main.py 以提供一个默认值:
wife = {'name': 'Rose', 'age': 33}
print(f'She is deeply in love with {wife.get("husband", "lover")}')
再次运行:
python3 main.py
现在输出使用了你自定义的默认值:
She is deeply in love with lover
使用 setdefault() 进行条件添加
setdefault() 方法提供了一种简洁的方式,仅在键尚不存在时才添加键值对。它会检查该键;如果存在,则返回该键的值。如果不存在,它会用指定的值插入该键并返回该值。
更新 main.py 以使用 setdefault():
wife = {'name': 'Rose', 'age': 33}
wife.setdefault('has_hair', True) ## 'has_hair' 不存在,因此被添加。
wife.setdefault('name', 'Lily') ## 'name' 存在,因此字典不会改变。
print(wife)
运行脚本:
python3 main.py
输出显示 'has_hair' 被添加了,但 'name' 的值没有被更新:
{'name': 'Rose', 'age': 33, 'has_hair': True}
从字典中移除条目
在这一步,你将练习从字典中移除条目的各种方法。
使用 pop() 移除
pop() 方法移除指定键的条目并返回其值。如果找不到该键,它会引发 KeyError,除非提供了默认值。
清空 main.py 并添加以下代码以查看 pop() 的实际效果:
wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
removed_value = wife.pop('age')
print(f"Removed value: {removed_value}")
print(wife)
运行脚本:
python3 main.py
输出显示了被移除的值以及移除后的字典:
Removed value: 33
{'name': 'Rose', 'hair': 'brown'}
使用 popitem() 移除
popitem() 方法移除字典中最后插入的条目(在 Python 3.7+ 中)。它返回被移除的条目作为一个 (key, value) 元组。
修改 main.py 以使用 popitem():
wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
removed_item = wife.popitem()
print(f"Removed item: {removed_item}")
print(wife)
运行脚本:
python3 main.py
最后一个条目 ('hair', 'brown') 被移除并打印出来:
Removed item: ('hair', 'brown')
{'name': 'Rose', 'age': 33}
使用 del 关键字移除
del 关键字可用于按键移除条目。它不返回被移除条目的值。
修改 main.py 以使用 del:
wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
del wife['age']
print(wife)
运行脚本:
python3 main.py
打印出的字典不包含 'age' 键:
{'name': 'Rose', 'hair': 'brown'}
使用 clear() 移除所有条目
clear() 方法从字典中移除所有条目,使其变为空。
修改 main.py 以使用 clear():
wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.clear()
print(wife)
运行脚本:
python3 main.py
输出是一个空字典:
{}
为了验证,请确保你的 main.py 使用 pop() 移除了 'age' 键并打印了最终的字典。
wife = {'name': 'Rose', 'age': 33, 'hair': 'brown'}
wife.pop('age')
print(wife)
字典工具操作
在这一步,你将发现一些有用的字典工具,包括检查键和值是否存在、美观打印(pretty-printing)以及合并字典。
使用 in 检查键和值
你可以使用 in 操作符来检查一个键是否存在于字典中。
清空 main.py 并添加以下代码:
person = {'name': 'Rose', 'age': 33}
print(f"'name' in person: {'name' in person}")
print(f"'height' in person: {'height' in person}")
运行脚本:
python3 main.py
输出显示存在键的结果为 True,不存在的键的结果为 False:
'name' in person: True
'height' in person: False
你也可以将 in 与 values() 方法一起使用,以检查一个值是否存在于字典中。
修改 main.py:
person = {'name': 'Rose', 'age': 33}
print(f"'Rose' in person.values(): {'Rose' in person.values()}")
print(f"33 in person.values(): {33 in person.values()}")
print(f"'John' in person.values(): {'John' in person.values()}")
运行它:
python3 main.py
输出:
'Rose' in person.values(): True
33 in person.values(): True
'John' in person.values(): False
使用 pprint 进行美观打印
当字典很大时,直接打印它们可能会导致一行很长、难以阅读的输出。pprint 模块提供了“美观打印”(pretty-print)功能,可以以更易读的方式格式化它们。
更新 main.py:
import pprint
wife = {'name': 'Rose', 'age': 33, 'has_hair': True, 'hair_color': 'brown', 'height': 1.6, 'eye_color': 'brown'}
pprint.pprint(wife)
运行脚本:
python3 main.py
输出格式整齐,键按字母顺序排序:
{'age': 33,
'eye_color': 'brown',
'hair_color': 'brown',
'has_hair': True,
'height': 1.6,
'name': 'Rose'}
合并字典
你可以使用字典解包运算符 **(Python 3.5+ 中可用)来合并两个字典。如果存在重复的键,将使用第二个字典中的值。
使用以下代码更新 main.py:
dict_a = {'a': 1, 'b': 2}
dict_b = {'b': 3, 'c': 4}
dict_c = {**dict_a, **dict_b}
print(dict_c)
运行脚本:
python3 main.py
输出是一个包含两者所有条目的新字典。注意,键 'b' 的值是 3,它来自 dict_b。
{'a': 1, 'b': 3, 'c': 4}
总结
恭喜你完成了关于 Python 字典的这个实验(Lab)!
在这个实验(Lab)中,你学习了操作 Python 最强大数据结构之一的基础操作。你涵盖了:
- 创建、访问和修改: 使用
{}创建字典,并使用下标运算符[]来添加、更新和检索数据。 - 迭代: 使用
keys()、values()和items()方法遍历键、值和键值对。 - 安全操作: 使用
get()来避免KeyError,以及使用setdefault()进行条件性添加条目。 - 移除条目: 使用
pop()、popitem()、del关键字和clear()来移除条目。 - 实用操作: 使用
in操作符检查成员资格,使用pprint格式化输出,以及使用**解包运算符合并字典。
掌握字典是成为熟练的 Python 程序员的关键一步。继续练习这些概念,以构建更复杂和高效的应用程序。



