11-嵌套的字典和列表
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')))
可以在https://autbor.com/guestpicnic/上查看该程序的执行情况。在 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()
函数,就会节约大量的时间。
你可以用自己喜欢的任何方法来用数据结构对事物建模,只要程序中的其他代码能够正确处理这个数据模型。在刚开始编程时,不需要太关心数据建模的“正确”方式。随着经验的增加,你可能会得到更有效的模型,重要的是该数据模型符合程序的需要。