Python 3 中字典的理解

介绍

字典是 Python 内置的 映射 类型。字典将 映射到 ,这些键值对提供了一种在 Python 中存储数据的有用方式。

通常用于保存相关的数据,例如 ID 或用户配置文件中包含的信息,字典使用花括号 { } 来构造。

信息:要跟随本教程中的示例代码,可以通过运行 python3 命令在本地系统上打开 Python 交互式 shell。然后,您可以在 >>> 提示符之后复制、粘贴或编辑示例。

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

除了花括号之外,字典中还有冒号(:)。

冒号左侧的词是键。键可以由任何不可变数据类型组成。上述字典中的键为:

  • 'username'
  • 'online'
  • 'followers'

上面示例中的每个键都是 字符串 值。

冒号右侧的词是值。值可以由任何数据类型组成。上述字典中的值为:

  • 'sammy-shark'
  • True
  • 987

这些值都是字符串,布尔值整数

让我们打印字典sammy

print(sammy)
Output
{'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'])
Output
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())
Output
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 个键是 usernameonline 状态,在我们运行这个小程序时可以找到:

Output
sammy-shark JOctopus True False

我们肯定可以改进程序,使输出更易于阅读,但这说明dict.keys()可以用于检查各个字典之间的共同之处或不同之处。这对于大型字典特别有用。

类似地,我们可以使用dict.values()方法查询sammy字典中的值,构造为sammy.values()。让我们打印出来:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

这两种方法keys()values()返回sammy字典中的键和值的未排序列表,分别为dict_keysdict_values的视图对象。

如果我们对字典中的所有项目感兴趣,可以使用items()方法访问它们:

print(sammy.items())
Output
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)
Output
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)
Output
{'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)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

在输出中,我们看到粉丝的数量从整数值305跳到了342

我们可以使用这种方法来向具有用户输入的字典添加键值对。让我们编写一个快速的程序usernames.py,它在命令行上运行,并允许用户输入更多的名称和关联的用户名:

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.')

让我们在命令行上运行该程序:

  1. python usernames.py

当我们运行程序时,我们会得到类似以下的输出:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

当我们测试程序完成后,我们可以按下CTRL + C来退出程序。你可以设置一个触发器来退出程序(比如输入字母q),并使用条件语句来改进代码。

这展示了如何通过交互式方式修改字典。对于这个特定的程序,一旦你用CTRL + C退出程序,除非你实现一种处理读写文件的方法,否则你将会丢失所有数据。

我们也可以使用dict.update()方法来添加和修改字典。这与列表中可用的append() 方法不同。

在下面的jesse字典中,让我们添加键'followers'并给它一个整数值,使用jesse.update()。随后,让我们print()更新后的字典。

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

从输出中,我们可以看到我们成功地将'followers': 481键值对添加到了字典jesse中。

我们也可以使用dict.update()方法来修改现有的键值对,通过替换特定键的给定值。

让我们将 Sammy 的在线状态从 True 改为 Falsesammy 字典中:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'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)
Output
{'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)
Output
{}

输出显示我们现在有一个空的字典,不包含任何键值对。

如果我们不再需要一个特定的字典,我们可以使用 del 完全摆脱它:

del jesse

print(jesse)

当我们删除 jesse 字典后运行调用 print(),我们会收到以下错误:

Output
... NameError: name 'jesse' is not defined

因为字典是可变数据类型,可以向其添加、修改和删除项以及清空。

结论

本教程介绍了 Python 中的字典数据结构。字典由键-值对组成,并提供一种存储数据的方式,而不依赖于索引。这使我们能够根据其含义和与其他数据类型的关系检索值。

从这里,您可以在我们的“理解数据类型”教程中了解更多关于其他数据类型的信息。

你可以在编程项目中看到字典数据类型的使用,比如使用Scrapy进行网络抓取

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3