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)
接下来,使用range()生成30个外星人:
#创建一个用于存储外星人的空列表
aliens = []
#创建30个绿色的外星人
for alien_number in range(30):
new_alien = {'color':'green','points':5,'speed':'slow'}
aliens.append(new_alien)
#显示前5个外星人
for alien in aliens[:5]:
print(alien)
print("...")
#显示创建了多少外星人
print("Total number of aliens: " + str(len(aliens)))
range()返回一系列数字
,其唯一用途是告诉我们要重复这个循环多少次,每次执行这个循环的时候,都创建一个外星人,并将其附加到列表aliens的末尾。后续使用切片打印五个外星人。然后打印列表的长度,以证实确实创建了30多个外星人。
在Python看来,每个外星人都是独立可以修改的,用for循环和if语句实现。
#将前三个外星人修改为黄色的、速度为中等且值10个点,
#创建一个用于存储外星人的空列表
print("\n")
aliens = []
#创建30个绿色的外星人
for alien_number in range(30):
new_alien = {'color':'green','points':5,'speed':'slow'}
aliens.append(new_alien)
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
#显示前5个外星人
for alien in aliens[:5]:
print(alien)
print("...")
#显示创建了多少外星人
print("Total number of aliens: " + str(len(aliens)))
你可以进一步扩展这个循环,在其中添加一个elif代码块
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien['points'] = 10
elif alien['color'] == 'yellow':
alien['color'] = 'red'
alien['speed'] = 'fast'
alien['points'] = 15
经常需要在列表中包含大量的字典,其中的字典都包含特定对象的众多信息。在这个列表中,所有的字典的结构都相同,因此可以遍历这个列表,并且以相同的方式处理其中的每个字典。
6.4.2 在字典中存储列表
#存储所点比萨的信息
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)
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。
#之前的程序员选择多种语句
#如果将每个人的回答都存储在一个列表中,被调查者就可选择多种喜欢的语言
#这种情况下遍历该字典的for循环中,需要再使用一个for循环来遍历与被调查者相关联的语言列表:
print("\n")
favorite_languages = {
'jen':['python','ruby'],
'sarch':['c'],
'edward':['ruby','go'],
'phil':['python','haskell'],
}
for name,languages in favorite_languages.items():
print("\n" + name.title() + "'s favorite languages are:")
for language in languages:
print("\t" + language.title())
可在遍历字典的for循环开头添加一条if语句,通过查看len(languages)的值来确定当前的被调查者喜欢的语言是否有多种。
列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单的解决问题的方案。
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())
print("\tLocation: " + location.title())
请注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。