理解Python3中的字典

来自菜鸟教程
(重定向自理解Python3中的字典
跳转至:导航、​搜索

介绍

dictionary 是 Python 内置的 mapping 类型。 字典将 keys 映射到 values 并且这些键值对提供了一种在 Python 中存储数据的有用方法。

通常用于保存相关数据,例如包含在 ID 或用户配置文件中的信息,字典由两侧的大括号 { } 构成。

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


字典看起来像这样:

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

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

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

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

上面示例中的每个键都是 string 值。

冒号右边的词是值。 Values 可以包含任何数据类型。 上面字典中的值是:

  • 'sammy-shark'
  • True
  • 987

这些值中的每一个都是字符串、Booleaninteger

让我们打印出字典 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'])
Outputsammy-shark

字典的行为类似于数据库,而不是像使用列表那样调用整数来获取特定的索引值,而是将值分配给键并可以调用该键来获取其相关值。

通过调用键 'username',我们接收到该键的值,即 'sammy-shark'

sammy 字典中的其余值可以类似地使用相同的格式调用:

sammy['followers']
# Returns 987

sammy['online']
# Returns True

通过利用字典的键值对,我们可以引用键来检索值。

使用方法访问元素

除了使用键来访问值之外,我们还可以使用一些内置方法:

  • dict.keys() 隔离键
  • dict.values() 隔离值
  • dict.items()(key, value) 元组对的列表格式返回项目

要返回密钥,我们将使用 dict.keys() 方法。 在我们的示例中,这将使用变量名称并且是 sammy.keys()。 让我们将其传递给 print() 方法并查看输出:

print(sammy.keys())
Outputdict_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状态,我们在运行这个小程序时可以找到:

Outputsammy-shark JOctopus
True False

我们当然可以改进程序以使输出更具用户可读性,但这说明 dict.keys() 可用于检查各种字典以查看它们的共同点或不同点。 这对于大型字典特别有用。

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

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

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

keys()values() 方法都返回 sammy 字典中存在的键和值的未排序列表,视图对象为 dict_keys 和 [ X165X] 分别。

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

print(sammy.items())
Outputdict_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)
Outputonline 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,它在命令行上运行并允许用户输入以添加更多名称和关联的用户名:

用户名.py

# Define original dictionary
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# Set up while loop to iterate
while True:

    # Request user to enter a name
    print('Enter a name:')

    # Assign to name variable
    name = input()

    # Check whether name is in the dictionary and print feedback
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # If the name is not in the dictionary...
    else:

        # Provide feedback        
        print('I don\'t have ' + name + '\'s username, what is it?')

        # Take in a new username for the associated name
        username = input()

        # Assign username value to name key
        usernames[name] = username

        # Print feedback that the data was updated
        print('Data updated.')

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

python usernames.py

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

OutputEnter 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字典中Sammy的在线状态由True改为False

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 进行 网页抓取。