有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。正如下面的示例将演示的,嵌套是一项强大的功能。
6.4.1 字典列表
字典watermelon包含一个西瓜的各种特征信息,但是无法储存第二个西瓜的特征。那么如何管理一堆西瓜呢?一种比较直观的方法就是创建一个列表,然后把所有的西瓜字典放进去,如:
watermelon_0 = {'size': 'large', 'sound': 'pongpongpong', 'color': 'red'}
watermelon_1 = {'size': 'medium', 'sound': 'bangbangbang', 'color': 'yellow'}
watermelon_2 = {'size': 'large', 'sound': 'bongbongbong', 'color': 'reddish'}
watermelons = [watermelon_0, watermelon_1, watermelon_2]
for melon in watermelons:
print(melon)
我们首先创建了三个字典,其中每个字典都表示一个西瓜。然后我们将这些字典都放到一个名为watermelons的列表中。最后,我们遍历这个列表,并将每个西瓜打印出来:
{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
{‘size’: ‘medium’, ‘sound’: ‘bangbangbang’, ‘color’: ‘yellow’}
{‘size’: ‘large’, ‘sound’: ‘bongbongbong’, ‘color’: ‘reddish’}
更符合现实的情形是,西瓜不止三个,且每个西瓜都是使用代码自动生成的。在下面的示例中,我们使用range()生成了20个保熟的西瓜:
watermelons = [] #创建空的西瓜列表
for _ in range(20): # range(20)创建一个有20个值的generator,由于我们不需要这些值,所以用_来指代它。
new_melon = {'size': 'large', 'sound': 'pongpongpong', 'color': 'red'} # 创建新的西瓜
watermelons.append(new_melon) # 把新的西瓜放进列表中
for melon in watermelons[:5]:
print(melon)
print(f'列表中一共有{len(watermelons)}个西瓜!')
输出:
{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
列表中一共有20个西瓜!
这些西瓜都具有相同的特征,但在Python看来,每个西瓜都是独立的,这让我们能够独立地修改每个西瓜。
6.4.2 在字典中存储列表
有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的粽子呢?如果使用列表,只能存储要添加的粽子馅料;但如果使用字典,就不仅可在其中包含粽子列表,还可包含其他有关粽子的描述。
zongzi_order = {
'orders': ['五花肉粽', '蛋黄五花肉粽', '蟹黄五花肉粽'],
'amount': [1, 2, 1],
'description': '这个顾客很识货,可以给他打个折'
}
print(f"您一共点了{sum(zongzi_order['amount'])}个粽子,"
f"其中{zongzi_order['orders'][0]}{zongzi_order['amount'][0]}个,"
f"{zongzi_order['orders'][1]}{zongzi_order['amount'][1]}个, "
f"{zongzi_order['orders'][2]}{zongzi_order['amount'][2]}个")
print(zongzi_order['description'])
输出:
您一共点了4个粽子,其中五花肉粽1个,蛋黄五花肉粽2个, 蟹黄五花肉粽1个
这个顾客很识货,可以给他打个折
在字典中存储字典
可在字典中嵌套字典,但这样做时,代码可能很快复杂起来。例如,如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在一个字典中,并将该字典作为与用户名相关联的值。在下面的程序中,对于每位用户,我们都存储了其三项信息:名、姓和描述;为访问这些信息,我们遍历所有的用户名,并访问与每个用户名相关联的信息字典:
users = {
'吃喵酱的花椒':{
'first': 'thomas',
'last' : 'pan',
'description' : '帅炸天了'
},
'吃花椒的喵酱':{
'first': 'six',
'last' : 'wang',
'description' : '太甜美了'
}
}
for user, info in users.items():
print(f"{user}")
for key, val in info.items():
print(f" {key} = {val}")
输出:
吃喵酱的花椒
first = thomas
last = pan
description = 帅炸天了
吃花椒的喵酱
first = six
last = wang
description = 太甜美了
请注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for循环内部的代码将更复杂。