6.4嵌套
有些时候需要将一系列字典存储在列表中,或者将列表作为值存储在字典中,这样称为嵌套。我们可以在列表中嵌套字典,在字典中嵌套列表甚至可以在字典中嵌套字典。嵌套是一种很强大的功能。
6.4.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 = []
#创建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(f"Total number of aliens: {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
这些外星人具备的特征都是相同的,但是在python看来,每个外星人都是独立的,这让我们能够独立地修改每个外星人。我们也会遇到处理成群结队的外星人。必要时,可使用for循环和if语句来修改某些外星人的颜色,例如,要将前三个外星人修改为黄色,速度为中等数值为10分。可以这样做:
# 创建一个用于存储外星人的空列表
aliens = []
#创建30个绿色的外星人
for alien_number in range(30):
new_alien = {'color':'green','points':5,'speed':'slow'}
aliens.append(new_alien)
#对前三个外星人的属性进行修改
for alien in aliens[:3]:
if alien['color'] == 'green':
alien['color'] ='yellow'
alien['speed'] = 'medium'
alien['points'] = 10
for alien in aliens[:5]:
print(alien)
print('...')
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
...
可进一步扩展循环,在其中添加一个elif代码块,将黄色外星人改为移动速度快且值为15的红色外星人:
aliens = []
#创建30个绿色的外星人
for alien_number in range(5):
new_alien = {'color':'green','points':5,'speed':'slow'}
aliens.append(new_alien)
for alien_number in range(5,10):
new_alien = {'color':'yellow','points':6,'speed':'medium'}
aliens.append(new_alien)
#对前三个外星人的属性进行修改
for alien in aliens[0:8]:
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
for alien in aliens[:8]:
print(alien)
print('...')
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'red', 'points': 15, 'speed': 'fast'}
{'color': 'red', 'points': 15, 'speed': 'fast'}
{'color': 'red', 'points': 15, 'speed': 'fast'}
...
经常需要在列表中包含大量字典,而其中每个字典都包含特定对象的众多信息。例如:你可能需要为一个网站的每个用户创建一个字典,并将这些字典存储在一个名为users的列表中。在这个列表中,所有字典的结构都相同,因此我们可以遍历整个列表,并以相同的方式处理其中的每个字典。
6.4.2 在字典中存储列表
# 存储所点披萨的信息
pizza = {'crust': 'thick',
'toppings':['mushrooms','extra chesse']}
print(f"You ordered a {pizza['crust']}-crust pizza with the following toppongs:")
for topping in pizza['toppings']:
print('\t'+topping)
You ordered a thick-crust pizza with the following toppongs:
mushrooms
extra chesse
首先创建一个字典,其中存储了有关顾客所点披萨的信息。在这个字典中,一个键是‘crust’,与之相关联的是字符串‘thick’;下一个是‘toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的配料。
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。再看下述一个例子:
favorite_language = {'jen':['python', 'ruby',],
'sarah':['c'],
'edward':['ruby','go'],
'phil':['python','haskell']
}
for name,languages in favorite_language.items():
print(f"\n{name.title()}'s favorite languages are:")
for language in languages:
print(f"\t{language.title()}")
Jen's favorite languages are:
Python
Ruby
Sarah's favorite languages are:
C
Edward's favorite languages are:
Ruby
Go
Phil's favorite languages are:
Python
Haskell
注意:列表和字典的嵌套层级不应该太多。如果嵌套层级比前面的示例多得多,很有可能有更简单的解决方案。
6.4.3在字典中存储字典
可在字典中嵌套字典,但这样做时,代码复杂度可能会很快复杂起来。例如:有多个网站的用户,每个用户都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在一个字典中,并将该字典作为与用户名相关联的值
首先定义了一个名为users的字典,其中包含两个键:用户名‘aeinstein’和‘mcurie’。与每个键盘相关联的值都是一个字典,其中包含用户的名、姓和居住地。
users = {
'aeinstein':{
'first':'albert',
'last':'einstein',
'location':'princeton',
},
'mucurie':{
'first':'marie',
'last':'curie',
'location':'paris',
},
}
for username, user_info in users.items():
print(f"\n Username:{username}")
full_name = f"{user_info['first']} {user_info['last']}"
location = user_info['location']
print(f"\t Full name :{full_name.title()}")
print(f"\tLocation: {location.title()}")
Username:aeinstein
Full name :Albert Einstein
Location: Princeton
Username:mucurie
Full name :Marie Curie
Location: Paris
我们这里注意的是,每位用户的字典都具有相同的结构。虽然python并没有这样的要求,但这使得嵌套的字典处理起来更加容易。倘若表示每位用户的字典都包含不同的键,for循环内部结构代码将变得复杂。