跳到主要内容

4.3 字典 dict

字典(dict)用来存成对的数据:一个"键"(key)对应一个"值"(value)。就像现实中的字典——通过"单词"查"释义"。

为什么需要字典

用列表存一个人的信息:

person = ["小明", 18, "上海"] # 哪个是年龄?得记住位置,容易乱

用字典存,每个数据都有名字,一目了然:

person = {"name": "小明", "age": 18, "city": "上海"}

创建和访问

用花括号 {},格式是 键: 值

person = {
"name": "小明",
"age": 18,
"city": "上海",
}

# 通过键访问值
print(person["name"]) # 小明
print(person["age"]) # 18

⚠️ 访问不存在的键会报错 KeyError。更安全的方式是用 get()

print(person["phone"]) # ❌ KeyError: 'phone'
print(person.get("phone")) # None(不报错)
print(person.get("phone", "未填写")) # 未填写(可指定默认值)

增、改、删

person = {"name": "小明", "age": 18}

# 增 / 改 用同一种写法:键存在就是改,不存在就是增
person["age"] = 19 # 改
person["city"] = "上海" # 增
print(person) # {'name': '小明', 'age': 19, 'city': '上海'}

# 删
del person["city"]

# 判断键是否存在
print("name" in person) # True

遍历字典

person = {"name": "小明", "age": 18, "city": "上海"}

# 最常用:同时遍历键和值
for key, value in person.items():
print(f"{key}: {value}")

# 只遍历键
for key in person:
print(key)

# 只遍历值
for value in person.values():
print(value)

字典 + 列表组合:真实世界的数据长这样

多条记录 = 列表里装多个字典。以后你接触的绝大多数数据(如网络接口返回的 JSON)都是这个结构:

students = [
{"name": "小明", "score": 90},
{"name": "小红", "score": 85},
{"name": "小刚", "score": 59},
]

for stu in students:
if stu["score"] >= 60:
print(f"{stu['name']} 及格了")
else:
print(f"{stu['name']} 需要补考")

经典应用:计数

统计每个字符出现的次数:

text = "hello world"
counter = {}

for ch in text:
if ch in counter:
counter[ch] += 1
else:
counter[ch] = 1

print(counter)
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

这个"用字典计数"的套路非常经典,第 10 章的词频统计项目就靠它。

练习

  1. 创建一个字典表示一部手机(品牌、价格、颜色),打印每一项:"品牌:xxx"。
  2. 有字典 prices = {"苹果": 8, "香蕉": 5}:把香蕉价格改为 4,新增"橘子: 6",删除苹果,最后打印字典。
  3. (挑战)让用户连续输入 3 个朋友的名字和电话,存进字典,最后支持按名字查询电话。
点击查看答案
# 1
phone = {"品牌": "华为", "价格": 4999, "颜色": "黑色"}
for k, v in phone.items():
print(f"{k}{v}")

# 2
prices = {"苹果": 8, "香蕉": 5}
prices["香蕉"] = 4
prices["橘子"] = 6
del prices["苹果"]
print(prices) # {'香蕉': 4, '橘子': 6}

# 3
contacts = {}
for i in range(3):
name = input("名字:")
tel = input("电话:")
contacts[name] = tel

query = input("要查谁的电话:")
print(contacts.get(query, "查无此人"))

本章小结

  • 字典存键值对:{"键": 值},通过键快速找值
  • d[k] 取值(不存在报错),d.get(k, 默认值) 更安全
  • d[k] = v 既能改也能增,del d[k] 删除
  • 遍历用 for k, v in d.items()
  • "列表套字典"是真实数据的常见形态

下一节:4.4 集合 set