agentmentoragentmentor

第 06 节:一条数据不够时:列表和字典

本节 objectives:

  • 用列表保存有顺序的多条数据
  • 用字典保存一个对象的多个字段
  • 判断一个小程序的数据该长成什么形状

先修:变量、循环、函数 | 上一节 << 05 | 下一节 07 >>

真正的小程序很快就不止一个值

一个待办事项可以只是字符串,但真正使用时你会想知道它是否完成。多个待办事项还需要顺序。Python 列表保存一串有顺序的值,字典保存键和值的对应关系1

这节不背所有方法,只练一个判断:顺序的一组东西用列表;一个东西的多个字段用字典。

讲解

列表适合“多个同类项”。 tasks = ["read", "write"] 表示一串任务标题。列表可以追加、遍历,也可以按位置取值1

字典适合“一个东西的字段”。 {"title": "read", "done": False} 把同一个任务的标题和完成状态放在一起。键像字段名,值是字段内容1

嵌套结构表达真实数据。 多个任务可以写成“列表里放字典”:每个字典是一条任务,整个列表是任务清单。

数据形状先于代码。 如果数据形状选错,后面循环和函数会变绕。先写一条样例数据,再写处理代码。

跟我做一遍(worked example)

打印任务清单:

python
tasks = [    {"title": "read docs", "done": True},    {"title": "write script", "done": False},]
for task in tasks:    if task["done"]:        mark = "x"    else:        mark = " "    print(f"[{mark}] {task['title']}")

外层列表负责顺序,内层字典负责字段。循环每次拿到一条任务,再根据 done 选择显示标记。

换你补全(faded example)

补全代码,向列表追加一条新任务:

python
tasks = []new_task = {"title": "practice loops", "done": ____}tasks.____(new_task)print(tasks)

答案:

python
tasks = []new_task = {"title": "practice loops", "done": False}tasks.append(new_task)print(tasks)

关键判断点是:刚创建的任务通常尚未完成,所以 done 应该是 False

小结 + 通向下一节

列表和字典让程序能处理一组有结构的数据。下一节把这些数据写进文件,让程序关闭后还能记住它们。

Footnotes

  1. Python Tutorial: Data Structures — https://docs.python.org/3/tutorial/datastructures.html 2 3

练习

Level 1: 建三条任务数据。

  • 做法:创建一个列表,里面放三个任务字典,每个字典都有 titledone
提示 1

先复制一条任务,再改值。 Level 2: 写 count_done(tasks)

  • 做法:函数接收任务列表,返回已完成数量。
提示 2

count = 0 开始。

看参考答案

这是第 4 节累加器和第 5 节函数的合体。

自评