介绍
字典是Python内置的 mapping类型,字典地图 keys到 values,这些关键值对提供了在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_keys
和dict_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 jesse
从jesse
字典中删除关键值对‘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。