嵌套
有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这种需求称之为嵌套。可以在列表中嵌套字典,在字典中嵌套列表甚至在字典中嵌套字典,嵌套是一项强大的功能。
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)
book@www.100ask.org:~/python/L9$ python aliens.py
{'color': ' green ', ' points ': 5}
{'color': ' yellow ', 'points': 10}
{'color': 'red', 'points': '15'}
首先创建三个字典,其中每一个字典表示一个外星人,然后,我们将这些字典都放到一个名字名字aliens的列表中,最后我们遍历这个列表,并将每个外星人都打印出来。
当然了更符合现实的是,游戏中外星人可不止三个,不然游戏多没意思啊,是不是,且每个外星人都是使用代码自动生成的,下面我们就举个小李子看看,我们使用range()生成30个外星人:
# Create empty list, use it store alien
aliens = []
#create thirties alien
for alien_number in range(30):
new_alien = {'color' : 'green' , 'points' : 5, 'speed' : 'slow'}
aliens.append(new_alien)
#display five alien
for alien in aliens[:5]:
print(alien)
print("...")
#Show how many aliens have been created
print("Total number of aliens: " + str(len(aliens)))
book@www.100ask.org:~/python/L9$ python aliens.py
{'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个点,可以这样做:
# Create empty list, use it store alien
aliens = []
#create thirties alien
for alien_number in range(0 , 30):
new_alien = {'color' : 'green' , 'points' : 5, 'speed' : 'slow'}
aliens.append(new_alien)
#display five alien
for alien in aliens[0 : 3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'medium'
alien[' points '] = 10
for alien in aliens[0 : 5]:
print(alien)
print("...")
book@www.100ask.org:~/python/L9$ python aliens.py
{'color': 'yellow', 'points': 5, 'speed': 'medium', ' points ': 10}
{'color': 'yellow', 'points': 5, 'speed': 'medium', ' points ': 10}
{'color': 'yellow', 'points': 5, 'speed': 'medium', ' points ': 10}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
...
鉴于要修改前三个外星人的信息,需要遍历一个只包含这些外星人的切片。当前,所有外星人都是绿色的,但情况并非总是如此,因此我们编写了一条if语句来确保只修改绿色外星人。如果外星人是绿色的,我们就将其颜色改为‘yellow’,将其速度改为‘medium’,并将其点数改为10.
当然还可以在进行扩展,如下:
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
想想怎么才能把yellow改为red呢?
经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的很多信息。例如,可能需要为网站的每个用户创建一个字典,并将这些字典存储在一个名为users的列表中,在这个列表中,所有字典的结构都相同,因此你可以遍历这个列表,并以相同的方式处理其中的每个字典。
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)
book@www.100ask.org:~/python/L9$ python pizza.py
You ordered a thick -crust pizza with the following toppings:
mushrooms
extra cheese
在例子中我们首先创建了一个列表,其中存储了有关顾客所点比萨的信息。在这个字典中,一个键是‘crust’,与之相关联的值是字符串‘thick’;下一个键是‘toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的配料。
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。
下面我们在举一个例子看看:
favorite_languages = {
'jen' : ['python' , 'ruby'],
'sarah' : ['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())
book@www.100ask.org:~/python/L9$ python favorite_languages.py
Sarah 's favorite languages are:
C
Edward 's favorite languages are:
Ruby
Go
Jen 's favorite languages are:
Python
Ruby
Phil 's favorite languages are:
Python
Haskell
可以这样进一步改进程序:
favorite_languages = {
'jen' : ['python' , 'ruby'],
'sarah' : ['C'],
'edward' : ['ruby' , 'go'],
'phil' : ['python' , 'haskell'],
}
for name , languages in favorite_languages.items():
if len(languages) > 1:
print("\n" + name.title() + " 's favorite languages are:")
for language in languages:
print("\t" +language.title())
else:
for language in languages:
print( name.title() + " 's favorite languages is " + language.title())
book@www.100ask.org:~/python/L9$ python favorite_languages.py
Sarah 's favorite languages is C
Edward 's favorite languages are:
Ruby
Go
Jen 's favorite languages are:
Python
Ruby
Phil 's favorite languages are:
Python
Haskell
3.在字典中存储字典
可在字典中嵌套字典,但是这样做,代码可能变得复杂起来。例如,如果有多个网站用户,每个用户都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在一个字典中,并将该字典作为与用户名相关联的值。在下面的程序中,对于每一位用户,我们都存储了其三项信息:名,姓和居住地;为访问这些信息,我们遍历所有的用户名,并访问与每个用户名相关联的信息字典:
users = {
'aeinstein' : {
'first' : 'albert',
'last' : 'einstein',
'location' : 'princeton',
},
'mcurie' : {
'first' : 'marie',
'last' : 'curie',
'location' : 'paris',
}
}
for username, userinfo in users.items():
print("\nUsername: " + username)
full_name = userinfo['first'] + userinfo['last']
location = userinfo['location']
print("\tFull name: " + full_name.title())
print("\t location: " + location.title())
book@www.100ask.org:~/python/L9$ python many_users.py
Username: aeinstein
Full name: Alberteinstein
location: Princeton
Username: mcurie
Full name: Mariecurie
location: Paris
在这个例子中,首先定义了一个名为users的字典,其中包含两个键:用户名‘aeinstein’和‘mcurie’;与每个键相关联的值都是一个字典,其中包含用户的名,姓和居住地。首先遍历字典users,让python依次将每个键存储在变量username中,并依次将与当前键相关联的字典存储在变量userinfo中,然后在主循环中我们将用户名打印出来,接着开始访问内部的字典,变量userinfo包含用户信息字典,而该字典包含三个键:‘first’,‘last’和‘location’;对于每位用户,我们都使用这些键来生成整洁的姓名和居住地,然后打印出来。
注意:表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使的嵌套的字典处理起来更容易。若是表示每位用户的字典都包含不同的键,for循环内部的代码将更加的复杂
newpeopel_0 = {'name' : 'xiao ming' , 'age ' : 23 , 'city' : 'Beijing' , 'jiaxiang' : 'hebei',}
newpeopel_1 = { 'name' : 'xiao hong' , 'age' : 18 , 'city' : 'Shanghai' , 'jiaxiang' : 'shanghai',}
newpeopel_2 = { 'name' : 'lao wang' , 'age' : 45 , 'city' : 'Shenzhen' , 'jiaxiang' : 'shenzhen',}
newpeopels = [newpeopel_0 , newpeopel_1, newpeopel_2]
for newpeopel in newpeopels:
print(newpeopel)
book@www.100ask.org:~/python/L9$ python new\ peopel.py
{'city': 'Beijing', 'jiaxiang': 'hebei', 'name': 'xiao ming', 'age ': 23}
{'city': 'Shanghai', 'age': 18, 'jiaxiang': 'shanghai', 'name': 'xiao hong'}
{'city': 'Shenzhen', 'age': 45, 'jiaxiang': 'shenzhen', 'name': 'lao wang'}
newpeopels = {
'xiaoming' : [23 , 'Beijing', 'HeBei'],
'xiaohong' : [18 , 'ShangHai' , 'ShangHai'],
'laowang' : [45 , 'ShenZhen', 'ShenZhen'],
}
for name, userinfos in newpeopels.items():
print("\n name: " + name.title())
for info in userinfos:
print( info)
book@www.100ask.org:~/python/L9$ python new\ peopel.py
name: Xiaoming
23
Beijing
HeBei
name: Xiaohong
18
ShangHai
ShangHai
name: Laowang
45
ShenZhen
ShenZhen