简介
字典是 Python 内置的映射类型。字典将键映射到值,这些键-值对为在 Python 中存储数据提供了一种有用的方式。
通常用于保存相关的数据,比如 ID 或用户资料中包含的信息,字典是由花括号 {
}
构建的。
一个字典看起来像这样:
sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
除了花括号,字典中还有冒号(:
)。冒号左边的词是键。键可以由任何不可变数据类型组成。上面字典中的键是:
'username'
'online'
'followers'
上面示例中的每个键都是字符串值。
冒号右边的词是值。值可以由任何数据类型组成。上面字典中的值是:
'sammy-shark'
True
987
这些值分别是字符串、布尔值或整数。
让我们打印字典 sammy
:
print(sammy)
{'username': 'sammy-shark', 'followers': 987, 'online': True}
从输出来看,键-值对的顺序可能已经发生了变化。在 Python 3.5 及更早版本中,字典数据类型是无序的。然而,在 Python 3.6 及更高版本中,字典数据类型保持有序。无论字典是否有序,键-值对都将保持不变,使我们能够根据它们的关联含义访问数据。
先决条件
您应该已经安装了 Python 3,并在计算机或服务器上设置了编程环境。如果您还没有设置编程环境,可以参考适用于您操作系统(Ubuntu、CentOS、Debian 等)的本地编程环境或服务器编程环境的安装和设置指南。
访问字典元素
我们可以通过引用相关的键来调用字典的值。
使用键访问数据项
因为字典提供了用于存储数据的键-值对,所以它们可以成为 Python 程序中的重要元素。
如果我们想要单独获取 Sammy 的用户名,可以通过调用 sammy['username']
来实现。让我们打印出来:
print(sammy['username'])
sammy-shark
字典的行为类似于数据库,不同之处在于,我们不是通过调用整数来获取特定索引值,而是为键分配一个值,并且可以调用该键来获取其相关的值。
通过调用键 'username'
,我们得到了该键的值,即 'sammy-shark'
。
sammy
字典中的其余值也可以使用相同的格式进行调用:
sammy['followers']
# 返回 987
sammy['online']
# 返回 True
通过使用字典的键-值对,我们可以引用键来检索值。
使用方法访问元素
除了使用键来访问值之外,我们还可以使用一些内置方法:
dict.keys()
用于隔离键dict.values()
用于隔离值dict.items()
返回一个由(key, value)
元组对组成的列表格式的项目
要返回键,我们将使用 dict.keys()
方法。在我们的示例中,这将使用变量名,并且是 sammy.keys()
。让我们将其传递给 print()
方法并查看输出:
print(sammy.keys())
dict_keys(['followers', 'username', 'online'])
我们得到的输出将键放在 dict_keys
类的可迭代视图对象中。然后,键以列表格式打印出来。
这种方法可以用于跨字典查询。例如,我们可以查看两个字典数据结构之间共享的常见键:
sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}
for common_key in sammy.keys() & jesse.keys():
print(sammy[common_key], jesse[common_key])
字典 sammy
和字典 jesse
分别是用户资料字典。
它们的资料有不同的键,因为 Sammy 有一个带有关联关注者的社交资料,而 Jesse 有一个带有关联积分的游戏资料。它们共有的 2 个键是 username
和 online
状态,我们可以在运行这个小程序时找到它们:
sammy-shark JOctopus
True False
我们当然可以改进程序,使输出更易于阅读,但这说明了 dict.keys()
可以用于跨多个字典检查它们共有或不共有的内容。这对于大型字典特别有用。
类似地,我们可以使用 dict.values()
方法查询 sammy
字典中的值,构造为 sammy.values()
。让我们打印出来:
sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
print(sammy.values())
dict_values([True, 'sammy-shark', 987])
keys()
和 values()
方法都返回 sammy
字典中的键和值的未排序列表,分别使用 dict_keys
和 dict_values
的视图对象。
如果我们对字典中的所有项目感兴趣,我们可以使用 items()
方法来访问它们:
print(sammy.items())
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])
返回的格式是一个由 (key, value)
元组对组成的列表,使用 dict_items
视图对象。
我们可以使用 for
循环遍历返回的列表格式。例如,我们可以打印出给定字典的每个键和值,然后通过添加字符串使其更易于人类理解:
for key, value in sammy.items():
print(key, 'is the key for the value', value)
online is the key for the value True
followers is the key for the value 987
username is the key for the value sammy-shark
上面的 for
循环遍历了 sammy
字典中的项目,并逐行打印了键和值,同时添加了一些信息,以便人类更容易理解。
我们可以使用内置方法从字典数据结构中访问项目、值和键。
修改字典
字典是一种可变数据结构,因此您可以对其进行修改。在本节中,我们将讨论如何添加和删除字典元素。
添加和更改字典元素
在不使用方法或函数的情况下,您可以通过以下语法向字典中添加键-值对:
dict[key] = value
我们将通过向名为 usernames
的字典添加键-值对来看看这是如何实现的:
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}
usernames['Drew'] = 'squidly'
print(usernames)
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}
我们现在看到字典已经更新为 'Drew': 'squidly'
键-值对。因为字典可能是无序的,所以这对可能出现在字典输出的任何位置。如果我们稍后在程序文件中使用 usernames
字典,它将包含额外的键-值对。
此外,此语法也可用于修改分配给键的值。在这种情况下,我们将引用现有键并传递一个不同的值给它。
让我们考虑一个名为 drew
的字典,它是给定网络上的用户之一。我们假设这个用户今天的关注者数量有所增加,因此我们需要更新传递给 'followers'
键的整数值。我们将使用 print()
函数来检查字典是否已被修改。
drew = {'username': 'squidly', 'online': True, 'followers': 305}
drew['followers'] = 342
print(drew)
{'username': 'squidly', 'followers': 342, 'online': True}
从输出中,我们看到关注者数量从整数值 305
跳到 342
。
我们可以使用此方法通过用户输入向字典中添加键-值对。让我们编写一个快速程序 usernames.py
,它在命令行上运行,并允许用户输入以添加更多的名称和相关的用户名:
# 定义原始字典
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}
# 设置 while 循环进行迭代
while True:
# 请求用户输入一个名称
print('Enter a name:')
# 分配给名称变量
name = input()
# 检查名称是否在字典中,并打印反馈
if name in usernames:
print(usernames[name] + ' is the username of ' + name)
# 如果名称不在字典中...
else:
# 提供反馈
print('I don\'t have ' + name + '\'s username, what is it?')
# 为关联名称输入新的用户名
username = input()
# 将用户名值分配给名称键
usernames[name] = username
# 打印数据已更新的反馈
print('Data updated.')
让我们在命令行上运行该程序:
python usernames.py
当我们运行程序时,我们将得到类似以下的输出:
当我们完成测试程序时,我们可以按 CTRL + C
退出程序。您可以设置一个触发器来退出程序(例如输入字母 q
)并使用条件语句来改进代码。
这展示了您可以交互地修改字典。对于这个特定的程序,一旦您使用 CTRL + C
退出程序,除非实现一种处理读取和写入文件的方式,否则您将丢失所有数据。
我们还可以使用 dict.update()
方法向字典中添加和修改键-值对。这与列表中可用的 append()
方法不同。
在下面的 jesse
字典中,让我们使用 jesse.update()
向其添加键 'followers'
并给它一个整数值。然后,让我们 print()
更新后的字典。
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}
jesse.update({'followers': 481})
print(jesse)
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}
从输出中,我们可以看到我们成功地向字典 jesse
添加了 'followers': 481
键-值对。
我们还可以使用 dict.update()
方法通过替换特定键的给定值来修改现有的键-值对。
让我们将 Sammy 的在线状态从 True
更改为 False
:
sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
sammy.update({'online': False})
print(sammy)
{'username': 'sammy-shark', 'followers': 987, 'online': False}
sammy.update({'online': False})
行引用了现有的键 'online'
并将其布尔值从 True
更改为 False
。当我们调用 print()
打印字典时,我们可以在输出中看到更新。
要添加项目到字典或修改值,我们可以使用 dict[key] = value
语法或 dict.update()
方法。
删除字典元素
与您可以向字典数据类型中添加键-值对和更改值一样,您也可以删除字典中的项目。
要从字典中删除键-值对,我们将使用以下语法:
del dict[key]
让我们以代表用户之一的 jesse
字典为例。我们假设 Jesse 不再使用在线游戏平台,因此我们将删除与 'points'
键相关的项目。然后,我们将打印出字典以确认项目已被删除:
jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}
del jesse['points']
print(jesse)
{'online': False, 'username': 'JOctopus', 'followers': 481}
del jesse['points']
行从 jesse
字典中删除了键-值对 'points': 723
。
如果我们想要清空字典中的所有值,我们可以使用 dict.clear()
方法。这将保留给定的字典,以便我们稍后在程序中使用它,但它将不再包含任何项目。
让我们清空 jesse
字典中的所有项目:
jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}
jesse.clear()
print(jesse)
{}
输出显示我们现在有一个空字典,不包含任何键-值对。
如果我们不再需要特定的字典,我们可以使用 del
完全将其删除:
del jesse
print(jesse)
当我们在删除 jesse
字典后运行 print()
时,我们将收到以下错误:
...
NameError: name 'jesse' is not defined
因为字典是可变数据类型,所以可以添加、修改和删除项目。
结论
本教程介绍了 Python 中的字典数据结构。字典由键-值对组成,提供了一种在不依赖索引的情况下存储数据的方式。这使我们能够根据值的含义和与其他数据类型的关系来检索数值。
你可以在编程项目中看到字典数据类型的应用,比如使用 Scrapy 进行网页抓取。