嵌套
字典列表:
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)
我们首先创建了三个字典,其中每个字典都表示一个外星人。在?处,我们将这些字典都放
到一个名为aliens的列表中。最后,我们遍历这个列表,并将每个外星人都打印出来:
{‘color‘: ‘green‘, ‘points‘: 5} {‘color‘: ‘yellow‘, ‘points‘: 10} {‘color‘: ‘red‘, ‘points‘: 15}
更符合现实的情形是,外星人不止三个,且每个外星人都是使用代码自动生成的。在下面的
示例中,我们使用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)))
{‘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‘, ‘color‘: ‘green‘, ‘points‘: 5}
...
Total number of aliens: 30
这些外星人都具有相同的特征,但在Python看来,每个外星人都是独立的,这让我们能够独
立地修改每个外星人。
在什么情况下需要处理成群结队的外星人呢?想象一下,可能随着游戏的进行,有些外星人
会变色且移动速度会加快。必要时,我们可以使用for循环和if语句来修改某些外星人的颜色。
例如,要将前三个外星人修改为黄色的、速度为中等且值10个点,可以这样做:
# 创建一个用于存储外星人的空列表 aliens = [] # 创建30个绿色的外星人 for alien_number in range (0,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
# 显示前五个外星人
for alien in aliens[0:5]:
print(alien)
print("...")
鉴于我们要修改前三个外星人,需要遍历一个只包含这些外星人的切片。当前,所有外星人
都是绿色的,但情况并非总是如此,因此我们编写了一条if语句来确保只修改绿色外星人。如果
外星人是绿色的,我们就将其颜色改为‘yellow‘,将其速度改为‘medium‘,并将其点数改为10,
如下面的输出所示:
{‘speed‘: ‘medium‘, ‘color‘: ‘yellow‘, ‘points‘: 10} {‘speed‘: ‘medium‘, ‘color‘: ‘yellow‘, ‘points‘: 10} {‘speed‘: ‘medium‘, ‘color‘: ‘yellow‘, ‘points‘: 10} {‘speed‘: ‘slow‘, ‘color‘: ‘green‘, ‘points‘: 5} {‘speed‘: ‘slow‘, ‘color‘: ‘green‘, ‘points‘: 5}
你可以进一步扩展这个循环,在其中添加一个elif代码块,将黄色外星人改为移动速度快且
值15个点的红色外星人,如下所示(这里只列出了循环,而没有列出整个程序):
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
在字典中存储列表:
在下面的示例中,存储了比萨的两方面信息:外皮类型和配料列表。其中的配料列表是一个
与键‘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
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。
注意 列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单
的解决问题的方案。
在字典中存储字典:
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()) Username: aeinstein Full name: Albert Einstein Location: Princeton
Username: mcurie Full name: Marie Curie Location: Paris
请注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌
套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for循环内部的代码将
更复杂。