python字典之嵌套

嵌套

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这种需求称之为嵌套。可以在列表中嵌套字典,在字典中嵌套列表甚至在字典中嵌套字典,嵌套是一项强大的功能。
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

发布了53 篇原创文章 · 获赞 16 · 访问量 2213

猜你喜欢

转载自blog.csdn.net/m0_37757533/article/details/105341354
今日推荐