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 章的词频统计项目就靠它。
练习
- 创建一个字典表示一部手机(品牌、价格、颜色),打印每一项:"品牌:xxx"。
- 有字典
prices = {"苹果": 8, "香蕉": 5}:把香蕉价格改为 4,新增"橘子: 6",删除苹果,最后打印字典。 - (挑战)让用户连续输入 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