有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。正如下面的示例将演示的,嵌套是一项强大的功能。
1. 字典列表
字典alien_0包含一个外星人的各种信息,但无法存储第二个外星人的信息,更别说屏幕上全部外星人的信息了。如何管理成群结队的外星人呢?一种办法是创建一个外星人列表,其中每个外星人都是以一个字典,包含有关该外星人的各种信息。例如,下面的代码创建一个包含三个外星人的列表:
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)
输出结果为:
{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
我们首先创建了三个字典,其中每个字典都表示一个外星人。然后我们将这些字典都放到一个名为aliens的列表中。最后我们遍历这个列表,并将每个外星人都打印出来。
更符合现实的情形是,外星人不止三个,且每个外星人都是使用代码自动生成的。在下面的示例中,我们使用range()生成了30个外星人:
# 创建一个用于存储外星人的空列表
aliens = []
# 创建30个绿色的外星人
for alien_number in range(30):
new_alien = {'color': 'green', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
# 显示前五个外星人
for alien in aliens[:5]:
print(alien)
print("...")
# 显示创建了多少个外星人
print("Total number of aliens: " + str(len(aliens)))
输出结果为:
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
...
Total number of aliens: 30
在这个示例中,首先创建了一个空列表,用于存储接下来将创建的所有外星人。然后range()返回一系列数字,其唯一的用途是告诉Python我们要重复这个循环多少次。每次执行这个循环时,都创建一个外星人,并将其附加到列表aliens末尾。最后,使用一个切片来打印前五个外星人,并打印列表长度,以证明确实创建了30个外星人。
2. 在字典中存储列表
有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的披萨呢?如果使用列表,只能存储要添加的披萨配料;但如果使用字典,就不仅可在其中包含配料列表,还可包含其他有关披萨的描述。
在下面的示例中,存储了披萨的两方面信息:外皮类型和配料列表。其中的配料列表是一个与键‘toppings’相关联的值。要访问该列表,我们使用字典名和键‘toppings’,就像访问字典中的其他值一样。这将返回一个配料列表,而不是单个值:
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)
输出结果为:
You ordered a thick-crust pizza with the following toppings:
mushrooms
extra cheese
我们首先创建了一个字典,其中存储了有关顾客所点披萨的信息。在这个字典中,一个键是‘crust’,与之相关联的值是字符串‘thick’;下一个键是‘toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的所有配料。制作前我们概述了顾客所点的披萨。为打印配料,我们编写了一个for循环。为访问配料列表,我们使用了键‘toppings’,这样Python将从字典中提取配料列表。
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。注意,列表和字典的嵌套层级不应太多。
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']
localtion = user_info['location']
print("\nFull name: " + full_name.title())
print("\tlocation: " + localtion.title())
输出结果为:
Username: aeinstein
Full name: Albert Einstein
location: Princeton
Username: mcurie
Full name: Marie Curie
location: Paris
我们首先定义一个名为users的字典,其中包含两个键:用户名'aeinstein'和'mcurie';与每个键相关联的值都是一个字典,其中包含用户的名、姓和居住地。遍历字典users,让Python依次将每个键存储在变量username中,并依次将与当前键相关联的字典存储在变量user_info中。在主循环内部,我们将用户名打印出来。然后,我们开始访问内部的字典。变量user_info包含用户信息字典,而该字典包含三个键'first', 'last'和'location';对于每个用户,我们都使用这些键来生成整洁的姓名和居住地。最后打印有关用户的简要信息。
注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。若表示每位用户的字典都包含不同的键,for循环内部的代码将更复杂。