将字典存储在列表中,或将列表作为字典的值,这称为嵌套。

可以在列表中嵌套字典、在字典中嵌套列表,甚至在字典中嵌套字典。

列表嵌套字典

一个字典中存储一个外星人的信息(颜色/击杀得分),无法存储第二外星人的信息,这就需要每个外星人都是一个字典,如下

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最喜欢的地方是:
    四川达州
    千户苗寨
    西安

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0