将字典存储在列表中,或将列表作为字典的值,这称为嵌套。
可以在列表中嵌套字典、在字典中嵌套列表,甚至在字典中嵌套字典。
列表嵌套字典
一个字典中存储一个外星人的信息(颜色/击杀得分),无法存储第二外星人的信息,这就需要每个外星人都是一个字典,如下
alien_0 = {'color': 'red', 'points': 5}
alien_1 = {'color': 'green', 'points': 10}
alien_2 = {'color': 'yellow', 'points': 15}
将三个字典放入一个列表中
aliens = [alien_0, alien_1, alien_2]
查看列表的输出结果
print(aliens)
for alien in aliens:
print(alien)
---
# 运行结果
[{'color': 'red', 'points': 5}, {'color': 'green', 'points': 10}, {'color': 'yellow', 'points': 15}]
{'color': 'red', 'points': 5}
{'color': 'green', 'points': 10}
{'color': 'yellow', 'points': 15}
现实情况中,外星人不可能只有3个,且每一个都是代码自动生成的
# 定义空列表,用于存储外星人字典
aliens = []
# 创建30个相同的外星人
for alien_num in range(30):
new_alien = {'color': 'red', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
# 查看前5个外星人
for alien in aliens[:5]:
print(alien)
print('外星人总数' + str(len(aliens)))
---
# 运行结果
{'color': 'red', 'points': 5, 'speed': 'slow'}
{'color': 'red', 'points': 5, 'speed': 'slow'}
{'color': 'red', 'points': 5, 'speed': 'slow'}
{'color': 'red', 'points': 5, 'speed': 'slow'}
{'color': 'red', 'points': 5, 'speed': 'slow'}
外星人总数30
以上示例中外星人具有相同特征,但在 Python 看来,每个外星人都是独立的,能够独立的修改每个外星人
随着游戏的进行,有些外星人的移动速度或者颜色会发生变化,可以通过 for 和 if 的使用来改变外形的参数
如:将前3个外星人改为黄色,速度为中等,击杀得分为10
# 定义空列表,用于存储外星人字典
aliens = []
# 创建30个相同的外星人
for alien_num in range(30):
new_alien = {'color': 'red', 'points': 5, 'speed': 'slow'}
aliens.append(new_alien)
# 修改前3个外星人的参数
for alien in aliens[:3]:
if alien['color'] == 'red':
alien['color'] = 'yellow'
alien['points'] = 10
alien['speed'] = 'medium'
# 查看前5个外星人,以证明修改成功
for alien in aliens[:5]:
print(alien)
---
# 运行结果
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'red', 'points': 5, 'speed': 'slow'}
{'color': 'red', 'points': 5, 'speed': 'slow'}
字典嵌套列表
列表可以作为字典键值对中的值,以上一篇文章中的每个人精通的技术为例,如下
proficient_technology = {
'Runzi': 'Kubernetes',
'Jin': 'Python',
'San': 'PhotoShop',
'JinFeng': '会计',
'FeiYi': 'Kubernetes',
}
以上例子中每个人只精通一种技术,现在要求每个人写出自己精通的至少2个技术,就可以使用字典嵌套列表,如下:
proficient_technology = {
'Runzi': ['Kubernetes', 'Python'],
'Jin': ['Python', 'Shell'],
'San': ['PhotoShop'],
'JinFeng': ['会计', '玩'],
'FeiYi': ['Kubernetes', 'Shell'],
}
使用 for 进行遍历时,第二个变量就是个列表,同样需要对列表进行遍历,所以需要用到两个 for 循环。
for name,techs in proficient_technology.items():
print("\n" + name + '精通的技术有' + str(len(techs)) + '种,分别是:')
for tech in techs:
print("\t" + tech)
---
# 运行结果
Runzi精通的技术有2种,分别是:
Kubernetes
Python
Jin精通的技术有2种,分别是:
Python
Shell
San精通的技术有1种,分别是:
PhotoShop
JinFeng精通的技术有2种,分别是:
会计
玩
FeiYi精通的技术有2种,分别是:
Kubernetes
Shell
字典嵌套字典
这样会显得代码复杂一些,理清逻辑理解起来会快一点
如,一个人的信息存储在字典中,要存储多个用户的场景,适合字典嵌套字典的方式
messages = {
'FeiYi': {
'age': 25,
'sex': 'man',
},
'JinFeng': {
'age': 25,
'sex': 'woman',
},
}
for username,user_info in messages.items():
print(username + ":\n\t" + str(user_info['age']) + '岁,是一个' + user_info['sex'])
---
# 运行结果
FeiYi:
25岁,是一个man
JinFeng:
25岁,是一个woman
练习
创建三个表示人的字典,如何将三个字典存储在列表中,将每个人的信息遍历打印
FeiYi = {
'first_name': 'Chai',
'last_name': 'Yanjiang',
'age': 25,
'city': '北京',
}
JinFeng = {
'first_name': 'Pei',
'last_name': 'Jinfeng',
'age': 25,
'city': '四川达州',
}
MuPei = {
'first_name': 'Chai',
'last_name': 'Feiyi',
'age': 25,
'city': '山西太原',
}
peoples = [FeiYi, JinFeng, MuPei]
for people in peoples:
print('我叫' + people['first_name'] + people['last_name'] +
',今年' + str(people['age']) + '岁' +
',来自' + people['city'])
---
# 运行结果
我叫ChaiYanjiang,今年25岁,来自北京
我叫PeiJinfeng,今年25岁,来自四川达州
我叫ChaiFeiyi,今年25岁,来自山西太原
创建一个名为 favorite_places
的字典,将三个人名作为键,每个键都存储1~3个地名,并友好的打印出来
favorite_places = {
'FeiYi': ['北京', '四川达州', '云南昆明'],
'JinFeng': ['四川达州', '千户苗寨', '西安']
}
for name,place in favorite_places.items():
print("\n" + name + "最喜欢的地方是:")
for i in place:
print("\t" + i)
---
# 运行结果
FeiYi最喜欢的地方是:
北京
四川达州
云南昆明
JinFeng最喜欢的地方是:
四川达州
千户苗寨
西安