5.3.2 嵌套的字典和列表

对井字棋盘建模相当简单:棋盘只需要一个字典, 包含 9 个键值对。当你对复杂的事物建模时, 可能发现字典和列表中需要包含其他字典和列表。列表适用于包含一组有序的值, 字典适合于包含关联的键与值。例如, 下面的程序使用字典包含其他字典,用于记录谁为野餐带来了什么食物。 totalBrought()函数可以读取这个数据结构, 计算所有客人带来的食物的总数。
 

allGuests  =  {'Alice':  {'apples':  5,  'pretzels':  12},
'Bob':  {'ham  sandwiches':  3,  'apples':  2},
'Carol':  {'cups':  3,  'apple  pies':  1}}

def  totalBrought(guests,  item): numBrought  =  0
➊            for  k,  v  in  guests.items():
➋                     numBrought  =  numBrought  +  v.get(item,  0) return  numBrought

print('Number  of  things  being  brought:')
print('  -  Apples  '  +  str(totalBrought(allGuests,  'apples'))) print('  -  Cups  '  +  
str(totalBrought(allGuests,  'cups'))) print('  -  Cakes  '  +  str(totalBrought(allGuests,  
'cakes')))
print('  -  Ham  Sandwiches  '  +  str(totalBrought(allGuests,  'ham  sandwiches'))) print('  -  
Apple  Pies  '  +  str(totalBrought(allGuests,  'apple  pies')))

在 totalBrought()函数中,for 循环迭代 guests 中的每个键值对➊。在这个循环里,客人的名字字符串赋给 k,他们带来的野餐食物的字典赋给 
v。如果食物参数是字典中存在的键,它的值(数量)就添加到 numBrought➋。如果它不是键,get()方法就返回 0,添加到 numBrought。
该程序的输出像这样:
Number  of  things  being  brought:
-  Apples  7
-  Cups  3
-  Cakes  0
-  Ham  Sandwiches  3
-  Apple  Pies  1
这似乎对一个非常简单的东西建模,你可能认为不需要费事去写一个程序来做到这一点。但是要认识到,这个函数 
totalBrought()可以轻易地处理一个字典,其中包含数千名客人,每个人都带来了“数千种”不同的野餐食物。这样用这种数据结构来保存信息,并使用 
totalBrought()函数,就会节约大量的时间!
你可以用自己喜欢的任何方法,用数据结构对事物建模,只要程序中其他代码能够正确处理这个数据模型。在刚开始编程时,不需要太担心数据建模的“正确”方式。随着经验增加,你可能会得到更有效的模型,但重要的是,该
数据模型符合程序的需要。

5.4    小结


在本章中,你学习了字典的所有相关知识。列表和字典是这样的值,它们可以

包含多个值,包括其他列表和字典。字典是有用的,因为你可以把一些项(键)映

射到另一些项(值),它不像列表,只包含一系列有序的值。字典中的值是通过方括号访问的,像列表一样。字典不是只能使用整数下标,而是可以用各种数据类型作为键:整型、浮点型、字符串或元组。通过将程序中的值组织
成数据结构,你可以创建真实世界事物的模型。井字棋盘就是这样一个例子。
这就介绍了 Python 编程的所有基本概念!在本书后面的部分,你将继续学习一些新概念,但现在你已学习了足够多的内容,可以开始编写一些有用的程序,让一些任务自动化。你可能不觉得自己有足够的 
Python 知识,来实现页面下载、更新电子表格,或发送文本消息。但这就是 Python 
模块要干的事!这些模块由其他程序员编写,提供了一些函数,让这些事情变得容易。所以让我们学习如何编写真正的程序,实现有用的自动化任务。

5.5    习题


1.空字典的代码是怎样的?
2.一个字典包含键'fow'和值 42,看起来是怎样的?
3.字典和列表的主要区别是什么?
4.如果 spam 是{'bar': 100},你试图访问 spam['foo'],会发生什么?
5.如果一个字典保存在 spam 中,表达式'cat' in spam 和'cat' in spam.keys()之间


的区别是什么?
6.如果一个字典保存在变量中,表达式'cat' in spam 和'cat' in spam.values()之间的区别是什么?
7.下面代码的简洁写法是什么?
if  'color'  not  in  spam: spam['color']  =  'black'
8.什么模块和函数可以用于“漂亮打印”字典值?

5.6    实践项目
作为实践,编程完成下列任务。

5.6.1   好玩游戏的物品清单
你在创建一个好玩的视频游戏。用于对玩家物品清单建模的数据结构是一个字典。其中键是字符串,描述清单中的物品,值是一个整型值,说明玩家有多少该物品。例如,字典值{'rope': 1, 'torch': 
6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}意味着玩家有 1 条绳索、6 个火把、42 枚金币等。
写一个名为 displayInventory()的函数,它接受任何可能的物品清单,并显示如下:

Inventory:
12  arrow
42  gold  coin
1  rope
6  torch
1  dagger
Total  number  of  items:  62


提示       你可以使用 for 循环,遍历字典中所有的键。


#  inventory.py
stuff  =  {'rope':  1,  'torch':  6,  'gold  coin':  42,  'dagger':  1,  'arrow':  12}

def  displayInventory(inventory): print("Inventory:") item_total  =  0
for  k,  v  in  inventory.items(): print(str(v)  +  '  '  +  k) item_total  +=  v
print("Total  number  of  items:  "  +  str(item_total)) displayInventory(stuff)

5.6.2   列表到字典的函数,针对好玩游戏物品清单
假设征服一条龙的战利品表示为这样的字符串列表:
dragonLoot  =  ['gold  coin',  'dagger',  'gold  coin',  'gold  coin',  'ruby']
写一个名为 addToInventory(inventory,  addedItems)的函数,其中 inventory 参数是一个字典,表示玩家的物品清单(像前面项目一样),addedItems 
参数是一个列表,就像 dragonLoot。
addToInventory()函数应该返回一个字典,表示更新过的物品清单。请注意,列表可以包含多个同样的项。你的代码看起来可能像这样:
def  addToInventory(inventory,  addedItems): #  your  code  goes  here

inv  =  {'gold  coin':  42,  'rope':  1}
dragonLoot  =  ['gold  coin',  'dagger',  'gold  coin',  'gold  coin',  'ruby'] inv  =  
addToInventory(inv,  dragonLoot)
displayInventory(inv)
前面的程序(加上前一个项目中的 displayInventory()函数)将输出如下:
Inventory:
45  gold  coin
1  rope
1  ruby
1  dagger

Total  number  of  items:  48
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大飞哥软件自习室

希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值