6 字典
在本章中,你将学习能够将相关信息关联起来的Python字典。你将学习如何访问和修改字典中的信息。鉴于字典可存储的信息量几乎不受限制,因此我们会演示如何遍 历字典中的数据。另外,你还将学习存储字典的列表、存储列表的字典和存储字典的字典。 理解字典后,你就能够更准确地为各种真实物体建模。你可以创建一个表示人的字典,然后想在其中存储多少信息就存储多少信息:姓名、年龄、地址、职业以及要 描述的任何方面。你还能够存储任意两种相关的信息,如一系列单词及其含义,一系列人名及其喜欢的数字,以及一系列山脉及其海拔等。
6.1 一个简单的字典
一个简单的字典就比如一个游戏中一个人物的信息,把他们相关的信息关联在一起,让其可以查询。
alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
print(alien_0['points'])
这就简单的展示了一个外星人的颜色和击杀所得的点数。
6.2 使用字典
在Python中,字典字典 是一系列键—值对值对 。每个键 都与一个值相关联,你可以使用键来访问与之相关联的值。键—值 对是两个相关联的值。 键和值之间用冒号分隔,而键—值对之间用逗号分隔。
6.2.1 访问键值
alien_0 = {'color': 'green'}
print(alien_0['color'])
这样便会输出它的颜色。
6.2.2 添加键
字典是一种动态结构,可随时在其中添加键—值对。要添加键—值对,可依次指定字典名、用方括号括起的键和相关联的值。
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
该代码便添加了外星人的位置坐标。
6.2.3 先创建一个空字典
先创建一个空的字典,有时是为了方便,有时是必须这样做。
alien_0 = {}
alien_0['color'] = 'green'
alien_0['points'] = 5
print(alien_0)
在{}中什么都不写入便是空字典。在后面也是可以往里面加入东西的。
6.2.4 修改字典中的值 修改字典中的值
alien_0 = {'color': 'green'}
print("The alien is " + alien_0['color'] + ".")
alien_0['color'] = 'yellow'
print("The alien is now " + alien_0['color'] + ".")
像这样便把上面所涉及到的外星人变成了黄色。
6.2.5 删除键 删除键—值对
对于字典中不再需要的信息,可使用del 语句将相应的键—值对彻底删除。使用del 语句时,必须指定字典名和要删除的键。
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)
del alien_0['points']
print(alien_0)
这便把外星人信息中的点数删除了。
6.2.6 由类似对象组成的字典
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
将一个较大的字典放在了多行中。其中每个键都是一个被调查者的名字,而每个值都是被调查者喜欢的语言。确定需要使用多行来定义字典时,在输入左花 括号后按回车键,再在下一行缩进四个空格,指定第一个键—值对,并在它后面加上一个逗号。此后你再次按回车键时,文本编辑器将自动缩进后续键—值对,且缩进量与第一 个键—值对相同。
6.3 遍历字典
一个Python字典可能只包含几个键—值对,也可能包含数百万个键—值对。鉴于字典可能包含大量的数据,Python支持对字典遍历。字典可用于以各种方式存储信息,因此有多种 遍历字典的方式:可遍历字典的所有键—值对、键或值。
6.3.1 遍历所有的键 遍历所有的键—值对
user_0 = { 'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items():
print("\nKey: " + key)
print("Value: " + value)
这代码用了items()方法,返回了一个键——值。 key和value都是其中的变量。用来打印键和值。
6.3.2 遍历字典中的所有键
在不需要使用字典中的值时,方法keys() 很有用。下面来遍历字典favorite_languages ,并将每个被调查者的名字都打印出来:
favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', } for name in favorite_languages.keys(): print(name.title())
这样全部打出来的便是键——值中的键。
6.3.3 按顺序遍历字典中的所有键
要以特定的顺序返回元素,一种办法是在for 循环中对返回的键进行排序。为此,可使用函数sorted() 来获得按特定顺序排列的键列表的副本:
favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', } for name in sorted(favorite_languages.keys()): print(name.title() + ", thank you for taking the poll.")
这便会按照字母顺序来输出键。
6.3.4 遍历字典中的所有值
可使用方法values() ,它返回一个值列表,而不包含任何键。
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in favorite_languages.values():
print(language.title())
这代码输出的全部就是用户的喜欢的语言。
这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但如果被调查者很多,最终的列表可能包含大量的重复项。为剔除重复项,可使用集 合(set)。集合集合 类似于列表,但每个元素都必须是独一无二的:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
print(language.title())
通过对包含重复元素的列表调用set() ,可让Python找出列表中独一无二的元素,并使用这些元素来创建一个集合。
6.4 嵌套
将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套嵌套 。可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。
6.4.1 字典列表
上面提到一个外星人的游戏,下面的代码创建一个包含三个外星人的列表:
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
aliens = [alien_0, alien_1, alien_2]
for alien in aliens:
print(alien)
首先创建了三个字典,其中每个字典都表示一个外星人。将这些字典都放到一个名为aliens 的列表中。最后,我们遍历这个列表,并将每个外星人都打印出 来。
在这个列表中,这种方式适合,所有字典的结构都相同,因此你可以遍历这个列表,并以相同的方式处理其中的每个字典。
6.4.2 在字典中存储列表
在前面说到的pizzas订购中,字典中有的结构不同,这种在字典中存储列表就比较适合。
pizza = { 'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'],
}
print("You ordered a " + pizza['crust'] + "-crust pizza " +
"with the following toppings:")
for topping in pizza['toppings']:
print("\t" + topping)
6.4.3 在字典中存储字典
。例如,如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在 一个字典中,并将该字典作为与用户名相关联的值。
users = { 'aeinstein': {
'first': 'albert',
'last': 'einstein',
'location': 'princeton',
},
'mcurie': {
'first': 'marie',
'last': 'curie',
'location': 'paris',
},
}
for username, user_info in users.items():
print("\nUsername: " + username)
full_name = user_info['first'] + " " + user_info['last']
location = user_info['location']
print("\tFull name: " + full_name.title())
注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for 循环内部的 代码将更复杂。
6.5 小结
本章学习了如何定义字典,以及如何使用存储在字典中的信息;如何访问和修改字典中的元素,以及如何遍历字典中的所有信息;如何遍历字典中所有的键-值对、所 有的键和所有的值;如何在列表中嵌套字典、在字典中嵌套列表以及在字典中嵌套字典。