第六章 字典(3)

6.4嵌套

有些时候需要将一系列字典存储在列表中,或者将列表作为值存储在字典中,这样称为嵌套。我们可以在列表中嵌套字典,在字典中嵌套列表甚至可以在字典中嵌套字典。嵌套是一种很强大的功能。

6.4.1 字典列表

字典alien_0包含了一个外星人的各种信息,但是无法存储第二个外星人的信息,更别说屏幕上全部外星人的信息了。如何管路成群结队地外星人呢?一种办法是创建一个外星人列表,其中每个外星人都都是字典,包含有关该外星人的各种信息,如下:

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)
{'color': 'green', 'points': 5}
{'color': 'yellow', 'points': 10}
{'color': 'red', 'points': 15}
#创建一个存储外星人的空列表
aliens = []

#创建30个绿色的外星人
for alien_number in range(30):
    new_alien = {'color':'green','points':5,'speed':'slow'}
    aliens.append(new_alien)

#显示前5个外星人
for alien in aliens[:5]:
    print(alien)
print('...')

#显示创建了多少个外星人
print(f"Total number of aliens: {len(aliens)}")
    
{'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, 'speed': 'slow'}
...
Total number of aliens: 30

这些外星人具备的特征都是相同的,但是在python看来,每个外星人都是独立的,这让我们能够独立地修改每个外星人。我们也会遇到处理成群结队的外星人。必要时,可使用for循环和if语句来修改某些外星人的颜色,例如,要将前三个外星人修改为黄色,速度为中等数值为10分。可以这样做:

# 创建一个用于存储外星人的空列表
aliens = []

#创建30个绿色的外星人
for alien_number in range(30):
    new_alien = {'color':'green','points':5,'speed':'slow'}
    aliens.append(new_alien)
#对前三个外星人的属性进行修改
for alien in aliens[:3]:
    if alien['color'] == 'green':
        alien['color'] ='yellow'
        alien['speed'] = 'medium'
        alien['points'] = 10
        
for alien in aliens[:5]:
    print(alien)
print('...')
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
{'color': 'green', 'points': 5, 'speed': 'slow'}
...

可进一步扩展循环,在其中添加一个elif代码块,将黄色外星人改为移动速度快且值为15的红色外星人:

aliens = []

#创建30个绿色的外星人
for alien_number in range(5):
    new_alien = {'color':'green','points':5,'speed':'slow'}
    aliens.append(new_alien)
for alien_number in range(5,10):
    new_alien = {'color':'yellow','points':6,'speed':'medium'}
    aliens.append(new_alien)
#对前三个外星人的属性进行修改
for alien in aliens[0:8]:
    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
        
for alien in aliens[:8]:
    print(alien)
print('...')
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'yellow', 'points': 10, 'speed': 'medium'}
{'color': 'red', 'points': 15, 'speed': 'fast'}
{'color': 'red', 'points': 15, 'speed': 'fast'}
{'color': 'red', 'points': 15, 'speed': 'fast'}
...

经常需要在列表中包含大量字典,而其中每个字典都包含特定对象的众多信息。例如:你可能需要为一个网站的每个用户创建一个字典,并将这些字典存储在一个名为users的列表中。在这个列表中,所有字典的结构都相同,因此我们可以遍历整个列表,并以相同的方式处理其中的每个字典。

6.4.2 在字典中存储列表

# 存储所点披萨的信息
pizza = {'crust': 'thick',
        'toppings':['mushrooms','extra chesse']}
print(f"You ordered a {pizza['crust']}-crust pizza with the following toppongs:")
for topping in pizza['toppings']:
    print('\t'+topping)
You ordered a thick-crust pizza with the following toppongs:
	mushrooms
	extra chesse

首先创建一个字典,其中存储了有关顾客所点披萨的信息。在这个字典中,一个键是‘crust’,与之相关联的是字符串‘thick’;下一个是‘toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的配料。

每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。再看下述一个例子:

favorite_language = {'jen':['python', 'ruby',],
                    'sarah':['c'],
                    'edward':['ruby','go'],
                    'phil':['python','haskell']
                    }
for name,languages in favorite_language.items():
    print(f"\n{name.title()}'s favorite languages are:")
    for language in languages:
        print(f"\t{language.title()}")
Jen's favorite languages are:
	Python
	Ruby

Sarah's favorite languages are:
	C

Edward's favorite languages are:
	Ruby
	Go

Phil's favorite languages are:
	Python
	Haskell

注意:列表和字典的嵌套层级不应该太多。如果嵌套层级比前面的示例多得多,很有可能有更简单的解决方案。

6.4.3在字典中存储字典

可在字典中嵌套字典,但这样做时,代码复杂度可能会很快复杂起来。例如:有多个网站的用户,每个用户都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在一个字典中,并将该字典作为与用户名相关联的值

首先定义了一个名为users的字典,其中包含两个键:用户名‘aeinstein’和‘mcurie’。与每个键盘相关联的值都是一个字典,其中包含用户的名、姓和居住地。

users = {
    'aeinstein':{
                'first':'albert',
                'last':'einstein',
                'location':'princeton',
                },
       'mucurie':{
                 'first':'marie',
                 'last':'curie',
                 'location':'paris',
                 },
        }
for username, user_info in users.items():
    print(f"\n Username:{username}")
    full_name = f"{user_info['first']} {user_info['last']}"
    location = user_info['location']
    
    print(f"\t Full name :{full_name.title()}")
    print(f"\tLocation: {location.title()}")
 Username:aeinstein
	 Full name :Albert Einstein
	Location: Princeton

 Username:mucurie
	 Full name :Marie Curie
	Location: Paris

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值