了解 Python 3 中的字典

介绍

字典是Python内置的 mapping类型,字典地图 keysvalues,这些关键值对提供了在Python中存储数据的有用方法。

通常用于存储相关的数据,例如ID或用户配置文件中包含的信息,字典是用两侧{ }的曲折字符构建的。

<$>[info] 信息: 要跟进本教程中的示例代码,请在本地系统上运行python3命令,打开Python交互壳。

一个字典看起来像这样:

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

除了弯曲的字母外,在整个字典中还有一些字母(:)。

列左侧的单词是键。 ** 键可以由任何不变的数据类型组成。

  • 用户名( ) * 用户名( ) * 用户名( )

每一个字母中,都有一个字符串(字符串)。

列右侧的单词是值。 ** 值可以由任何数据类型组成。

  • 'sammy-shark'
  • True
  • 987

每一個人,都是一個,或是一個,或是一個,或是一個,或是一個,或是一個。

让我们打印出sammy字典:

1print(sammy)
1[secondary_label Output]
2{'username': 'sammy-shark', 'followers': 987, 'online': True}

在 Python 版本 3.5 和更早版本中,字典数据类型不受排序,但是在 Python 版本 3.6 和更高版本中,字典数据类型仍然保持排序,无论字典是否排序,关键值对将保持不变,使我们能够根据其关系意义访问数据。

前提条件

如果您没有设置编程环境,您可以参考本地编程环境的安装和安装指南(https://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-python-3)或适用于您的操作系统(Ubuntu, CentOS, Debian 等)的编程环境(https://www.digitalocean.com/community/tutorial_collections/how-to-install-python-3-and-set-up-a-programming-environment)。

获取字典元素

我们可以通过引用相关的密钥来调用字典的值。

使用 Keys 访问数据元素

由于字典提供了存储数据的关键值对,因此它们可以在Python程序中成为重要的元素。

如果我们想隔离Sammy的用户名,我们可以这样做,叫sammy(用户名)

1print(sammy['username'])
1[secondary_label Output]
2sammy-shark

字典行为就像一个数据库,而不是调用一个整数以获得特定索引值,就像你在列表中一样,你将一个值分配给一个密钥,并可以调用该密钥以获得相关值。

通过召唤用户名密钥,我们获得该密钥的值,即sammy-shark

sammy字典中的剩余值也可以用相同的格式调用:

1sammy['followers']
2# Returns 987
3
4sammy['online']
5# Returns True

通过使用字典的关键值对,我们可以引用密钥来检索值。

使用方法访问元素

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

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

要返回密钥,我们会使用 dict.keys() 方法. 在我们的示例中,这将使用变量名称,并且是 sammy.keys()

1print(sammy.keys())
1[secondary_label Output]
2dict_keys(['followers', 'username', 'online'])

我们收到输出,将密钥放置在dict_keys类的可迭代视图对象中,然后将密钥打印到列表格式中。

例如,我们可以看看两个字典数据结构之间共享的常见密钥:

1sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
2jesse = {'username': 'JOctopus', 'online': False, 'points': 723}
3
4for common_key in sammy.keys() & jesse.keys():
5    print(sammy[common_key], jesse[common_key])

字典sammy和字典jesse是用户配置字典。

然而,他们的配置文件有不同的密钥,因为Sammy有一个与相关追随者的社交配置文件,而Jesse有一个与相关点的游戏配置文件,他们共同的两个密钥是用户名在线状态,我们可以在运行这个小程序时找到:

1[secondary_label Output]
2sammy-shark JOctopus
3True False

我们当然可以改进该程序以使输出更易于用户读取,但这说明‘dict.keys()’可以用来检查各种字典,看看它们是否共享共同点。

同样,我们可以使用dict.values()方法查询sammy字典中的值,这将被构建为sammy.values()

1sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
2
3print(sammy.values())
1[secondary_label Output]
2dict_values([True, 'sammy-shark', 987])

两种方法keys()values()都返回sammy字典中存在的密钥和值的未分类列表,分别是dict_keysdict_values的视图对象。

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

1print(sammy.items())
1[secondary_label Output]
2dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

返回的格式是由 (关键,值) tuple 对和 `dict_items' 视图对象组成的列表。

例如,我们可以打印给定字典的每个密钥和值,然后通过添加一个字符串来使其更易于人读:

1for key, value in sammy.items():
2    print(key, 'is the key for the value', value)
1[secondary_label Output]
2online is the key for the value True
3followers is the key for the value 987
4username is the key for the value sammy-shark

上面的for循环重复了sammy字典中的项目,并将密钥和价值列出,以便让人类更容易理解。

我们可以使用内置方法访问词典数据结构中的项目、值和密钥。

变更字典

字典是一个可变的数据结构,所以您可以修改它们. 在本节中,我们将讨论添加和删除字典元素。

添加和更改字典元素

没有使用方法或函数,您可以使用以下语法将关键值对添加到字典中:

1dict[key] = value

我们将通过将一个关键值对添加到名为用户名的字典中来看看这在实践中是如何工作的:

1usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}
2
3usernames['Drew'] = 'squidly'
4
5print(usernames)
1[secondary_label Output]
2{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

现在我们看到字典已经更新了Drew:squidly的关键值对. 因为字典可能不排序,这对可能发生在字典输出中的任何地方. 如果我们在我们的程序文件中使用用户名字典,它将包括额外的关键值对。

此外,该语法可用于更改分配给密钥的值,在这种情况下,我们将引用现有密钥并传递另一个值。

我们会说,这个用户今天有追随者,所以我们需要更新传递给追随者键的整数值,我们会使用print()函数来检查字典是否被修改。

1drew = {'username': 'squidly', 'online': True, 'followers': 305}
2
3drew['followers'] = 342
4
5print(drew)
1[secondary_label Output]
2{'username': 'squidly', 'followers': 342, 'online': True}

在输出中,我们看到追随者的数量从305的整数值跳到342

我们可以使用这种方法将关键值对添加到用用户输入的字典中,让我们写一个快速的程序,‘usernames.py’,该程序运行在命令行上,并允许用户输入添加更多的名称和相关的用户名:

 1[label usernames.py]
 2# Define original dictionary
 3usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}
 4
 5# Set up while loop to iterate
 6while True:
 7
 8    # Request user to enter a name
 9    print('Enter a name:')
10
11    # Assign to name variable
12    name = input()
13
14    # Check whether name is in the dictionary and print feedback
15    if name in usernames:
16        print(usernames[name] + ' is the username of ' + name)
17
18    # If the name is not in the dictionary...
19    else:
20
21        # Provide feedback        
22        print('I don\'t have ' + name + '\'s username, what is it?')
23
24        # Take in a new username for the associated name
25        username = input()
26
27        # Assign username value to name key
28        usernames[name] = username
29
30        # Print feedback that the data was updated
31        print('Data updated.')

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

1python usernames.py

当我们运行该程序时,我们将获得如下输出:

 1[secondary_label Output]
 2Enter a name:
 3Sammy
 4sammy-shark is the username of Sammy
 5Enter a name:
 6Jesse
 7I don't have Jesse's username, what is it?
 8JOctopus
 9Data updated.
10Enter a name:

当我们完成测试程序时,我们可以按CTRL + C来逃离程序,您可以设置一个触发器来退出程序(如输入字母q)用 条件声明来改进代码。

通过这个特定程序,一旦你用CTRL + C离开该程序,你将失去所有的数据,除非你实施一种方法来处理阅读和写入文件(https://andsky.com/tech/tutorials/how-to-handle-plain-text-files-in-python-3)。

我们还可以使用dict.update()方法添加和修改字典,这取决于在列表中可用的append()方法(https://andsky.com/tech/tutorials/how-to-use-list-methods-in-python-3#listappend()

在下面的jesse字典中,让我们添加键followers并给它一个整数值,用jesse.update()

1jesse = {'username': 'JOctopus', 'online': False, 'points': 723}
2
3jesse.update({'followers': 481})
4
5print(jesse)
1[secondary_label Output]
2{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

从输出中可以看出,我们已经成功地将``追随者:481的关键值对添加到jesse字典中。

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

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

1sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
2
3sammy.update({'online': False})
4
5print(sammy)
1[secondary_label Output]
2{'username': 'sammy-shark', 'followers': 987, 'online': False}

sammy.update({'online: False}) 引用现有密钥 'online',并将其布尔文值从 True修改为False. 当我们在字典中调用 print() 时,我们在输出中看到更新。

要将项目添加到字典或修改值,我们可以使用dict[key] = value语法或dict.update()方法。

删除字典元素

就像您可以添加关键值对并在字典数据类型中更改值一样,您也可以在字典中删除项目。

要从字典中删除一个关键值对,我们将使用以下语法:

1del dict[key]

我们会说Jesse不再使用在线平台玩游戏,所以我们会删除与密钥相关的项目,然后,我们会打印字典来确认该项目已被删除:

1jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}
2
3del jesse['points']
4
5print(jesse)
1[secondary_label Output]
2{'online': False, 'username': 'JOctopus', 'followers': 481}

del jessejesse字典中删除关键值对‘points:723`。

如果我们想清除一个词典的所有值,我们可以用dict.clear()方法这样做,这将保留给定的词典,如果我们需要在程序中使用它,但它将不再包含任何项目。

让我们在jesse字典中删除所有项目:

1jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}
2
3jesse.clear()
4
5print(jesse)
1[secondary_label Output]
2{}

结果表明,我们现在有一个空的字典,没有关键值对。

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

1del jesse
2
3print(jesse)

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

1[secondary_label Output]
2...
3NameError: name 'jesse' is not defined

由于字典是可变数据类型,可以添加、修改、删除和清除项目。

结论

本教程通过了Python的字典数据结构。字典由关键值对组成,并提供了存储数据而不依赖索引的方法,这使我们能够根据其含义和与其他数据类型的关系获取值。

从这里,您可以在我们的理解数据类型(LINK0)教程中了解更多有关其他数据类型。

您可以看到在编程项目中使用的字典数据类型,例如 web scraping with Scrapy

Published At
Categories with 技术
comments powered by Disqus