Python 字典

PythonBeginner
立即练习

介绍

在 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 程序员的关键一步。继续练习这些概念,以构建更复杂和高效的应用程序。