有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。正如下面的示例将演示的,嵌套是一项强大的功能。

6.4.1 字典列表

字典watermelon包含一个西瓜的各种特征信息,但是无法储存第二个西瓜的特征。那么如何管理一堆西瓜呢?一种比较直观的方法就是创建一个列表,然后把所有的西瓜字典放进去,如:

  1. watermelon_0 = {'size': 'large', 'sound': 'pongpongpong', 'color': 'red'}
  2. watermelon_1 = {'size': 'medium', 'sound': 'bangbangbang', 'color': 'yellow'}
  3. watermelon_2 = {'size': 'large', 'sound': 'bongbongbong', 'color': 'reddish'}
  4. watermelons = [watermelon_0, watermelon_1, watermelon_2]
  5. for melon in watermelons:
  6. print(melon)

我们首先创建了三个字典,其中每个字典都表示一个西瓜。然后我们将这些字典都放到一个名为watermelons的列表中。最后,我们遍历这个列表,并将每个西瓜打印出来:


{‘size’: ‘large’, ‘sound’: ‘pongpongpong’, ‘color’: ‘red’}
{‘size’: ‘medium’, ‘sound’: ‘bangbangbang’, ‘color’: ‘yellow’}
{‘size’: ‘large’, ‘sound’: ‘bongbongbong’, ‘color’: ‘reddish’}


更符合现实的情形是,西瓜不止三个,且每个西瓜都是使用代码自动生成的。在下面的示例中,我们使用range()生成了20个保熟的西瓜:

  1. watermelons = [] #创建空的西瓜列表
  2. for _ in range(20): # range(20)创建一个有20个值的generator,由于我们不需要这些值,所以用_来指代它。
  3. new_melon = {'size': 'large', 'sound': 'pongpongpong', 'color': 'red'} # 创建新的西瓜
  4. watermelons.append(new_melon) # 把新的西瓜放进列表中
  5. for melon in watermelons[:5]:
  6. print(melon)
  7. 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 在字典中存储列表

有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的粽子呢?如果使用列表,只能存储要添加的粽子馅料;但如果使用字典,就不仅可在其中包含粽子列表,还可包含其他有关粽子的描述。

  1. zongzi_order = {
  2. 'orders': ['五花肉粽', '蛋黄五花肉粽', '蟹黄五花肉粽'],
  3. 'amount': [1, 2, 1],
  4. 'description': '这个顾客很识货,可以给他打个折'
  5. }
  6. print(f"您一共点了{sum(zongzi_order['amount'])}个粽子,"
  7. f"其中{zongzi_order['orders'][0]}{zongzi_order['amount'][0]}个,"
  8. f"{zongzi_order['orders'][1]}{zongzi_order['amount'][1]}个, "
  9. f"{zongzi_order['orders'][2]}{zongzi_order['amount'][2]}个")
  10. print(zongzi_order['description'])

输出:


您一共点了4个粽子,其中五花肉粽1个,蛋黄五花肉粽2个, 蟹黄五花肉粽1个
这个顾客很识货,可以给他打个折


在字典中存储字典

可在字典中嵌套字典,但这样做时,代码可能很快复杂起来。例如,如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在一个字典中,并将该字典作为与用户名相关联的值。在下面的程序中,对于每位用户,我们都存储了其三项信息:名、姓和描述;为访问这些信息,我们遍历所有的用户名,并访问与每个用户名相关联的信息字典:

  1. users = {
  2. '吃喵酱的花椒':{
  3. 'first': 'thomas',
  4. 'last' : 'pan',
  5. 'description' : '帅炸天了'
  6. },
  7. '吃花椒的喵酱':{
  8. 'first': 'six',
  9. 'last' : 'wang',
  10. 'description' : '太甜美了'
  11. }
  12. }
  13. for user, info in users.items():
  14. print(f"{user}")
  15. for key, val in info.items():
  16. print(f" {key} = {val}")

输出:


吃喵酱的花椒
first = thomas
last = pan
description = 帅炸天了
吃花椒的喵酱
first = six
last = wang
description = 太甜美了


请注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for循环内部的代码将更复杂。