用「名字」而不是「编号」来存东西。列表按位置找,字典按标签找。
设 通讯录 = {"妈妈": "138", "爸爸": "139"}
花括号 {} 里是一对对的「标签:值」。想查谁的号码,直接用名字查:
设 通讯录 = {"妈妈": "138", "爸爸": "139"}
打印(通讯录["妈妈"]) # 138
打印(通讯录["爸爸"]) # 139
想象每样东西上都贴了一张标签,靠标签找到它对应的值。这里的标签是 "妈妈"、"爸爸",值就是电话号码。
和列表比:列表用编号([0])取,字典用标签(["妈妈"])取。
设 通讯录 = {"妈妈": "138"}
通讯录["爸爸"] = "139" # 没有这个标签 → 加进去
通讯录["妈妈"] = "10086" # 有这个标签 → 改值
打印(通讯录) # {妈妈: 10086, 爸爸: 139}
直接访问不存在的标签会报 CN0308。想先确认,用 有标签:
设 通讯录 = {"妈妈": "138"}
如果 有标签(通讯录, "爸爸")
打印(通讯录["爸爸"])
否则
打印("查无此人")
| 函数 | 作用 | 例子 |
|---|---|---|
所有标签(字) |
拿出所有标签,成一个列表 | 所有标签(通讯录) → [妈妈, 爸爸] |
所有值(字) |
拿出所有值,成一个列表 | 所有值(通讯录) → [138, 139] |
有标签(字, 标签) |
有没有这个标签 | 有标签(通讯录, "妈妈") → 真 |
删标签(字, 标签) |
删掉一个标签;标签不存在时不报错 | 删标签(通讯录, "妈妈") |
设 通讯录 = {"妈妈": "138", "爸爸": "139"}
打印(所有标签(通讯录)) # [妈妈, 爸爸]
打印(所有值(通讯录)) # [138, 139]
打印(有标签(通讯录, "哥哥")) # 假
删标签(通讯录, "妈妈")
打印(通讯录) # {爸爸: 139}
字典和遍历是天作之合。直接遍历字典,自动得到一个个标签:
设 成绩 = {"小明": 85, "小红": 92, "小刚": 78}
遍历 成绩 每个 名
打印(名 + ":" + 文本(成绩[名]))
# 小明:85
# 小红:92
# 小刚:78
遍历 成绩 每个 名会逐个取出标签(人名),再用成绩[名]拿到分数。不必专门写所有标签()。
(遍历语法在下一课细讲。)
💡 遍历字典时,先后顺序没有保证——上面的例子碰巧按放进去的顺序打印,别依赖这个顺序。想要固定的顺序,用列表。
两个都能存一堆东西,什么时候用哪个?
| 场景 | 用哪个 |
|---|---|
| 只是排队、看重顺序 | 列表 [...] |
| 要用名字查东西、成对对应 | 字典 {...} |
一句话:有编号就够用列表;要按名字找东西就用字典。
学过 Python 的人,看这里——这一章学的,用 Python 写是这样。零基础可以直接跳过,去下面做「练一练」。
先把这一章串成一个完整程序(CNplus):
设 通讯录 = {"妈妈": "138"}
通讯录["爸爸"] = "139"
打印(通讯录["妈妈"])
打印(有标签(通讯录, "爸爸"))
同一个程序,用 Python 写:
通讯录 = {"妈妈": "138"}
通讯录["爸爸"] = "139" # 加新键,一样
print(通讯录["妈妈"])
print("爸爸" in 通讯录) # 有标签(通讯录, "爸爸")
| CNplus | Python |
|---|---|
有标签(字, 标签) |
标签 in 字 |
删标签(字, 标签) |
del 字[标签] |
所有标签(字) |
字.keys() |
所有值(字) |
字.values() |
遍历 字 每个 标签 |
for 标签 in 字 |
术语上:CNplus 把「键」叫「标签」(键 是编程术语,「标签」更好懂),Python 叫 key。本质上是一个东西。
下一步:做练习,然后继续下一课。