Skip to main content

字典

字典(dictionary)是 Python 中用来存"键值对"的数据结构。如果列表是靠编号找元素,字典就是靠"名字"找元素。它非常适合存储结构化数据,比如学生信息、配置项、统计结果等。

创建字典

用花括号 {} 定义,每个键值对用冒号 : 分隔:

student = {"name": "Alice", "major": "CS", "year": 3}
print(student["name"]) # Alice
print(student["major"]) # CS

键必须是唯一的,值可以是任何类型(字符串、数字、列表、甚至另一个字典)。

添加和修改

给不存在的键赋值就是添加:

student = {"name": "Alice", "major": "CS"}
student["year"] = 3 # 添加新键值对
student["major"] = "AI" # 修改已有值
print(student)
# {'name': 'Alice', 'major': 'AI', 'year': 3}

删除键值对

del 删除:

student = {"name": "Alice", "major": "CS", "year": 3}
del student["year"]
print(student)
# {'name': 'Alice', 'major': 'CS'}

用 get() 安全取值

直接用 [] 取不存在的键会报错:

student = {"name": "Alice"}
print(student["gpa"]) # KeyError

get() 可以避免报错,还可以指定默认值:

student = {"name": "Alice"}
gpa = student.get("gpa", "未录入")
print(gpa) # 未录入

空字典

有时候需要先生成空字典,再往里填数据:

members = {}
members["Alice"] = "Python"
members["Bob"] = "C++"
print(members)
# {'Alice': 'Python', 'Bob': 'C++'}

遍历字典

遍历所有键值对

items() 方法:

members = {
"Alice": "Python",
"Bob": "C++",
"Carol": "Rust",
}

for name, language in members.items():
print(f"{name} 喜欢 {language}")

输出:

Alice 喜欢 Python
Bob 喜欢 C++
Carol 喜欢 Rust

只遍历键

keys() 或直接遍历字典:

for name in members.keys():
print(name)

# 等价于
for name in members:
print(name)

配合列表做条件判断:

friends = ["Alice", "Bob"]
for name in members:
if name in friends:
print(f"{name} 是我们的老朋友了")

检查某个键是否存在:

if "David" not in members:
print("David 还没填问卷")

按顺序遍历键

字典从 Python 3.7 开始保留插入顺序,但如果你想按字母顺序遍历,可以用 sorted()

for name in sorted(members.keys()):
print(f"感谢 {name} 参与投票")

只遍历值

values() 方法:

for language in members.values():
print(language)

如果有重复值,可以用 set() 去重:

members = {"Alice": "Python", "Bob": "Python", "Carol": "Rust"}
for language in set(members.values()):
print(language)
# Python
# Rust

嵌套

字典列表

多个字典放进列表里:

student1 = {"name": "Alice", "score": 90}
student2 = {"name": "Bob", "score": 85}
student3 = {"name": "Carol", "score": 95}

students = [student1, student2, student3]

for s in students:
print(f"{s['name']}: {s['score']} 分")

批量生成数据:

students = []
for i in range(5):
new_student = {"name": f"学生{i+1}", "score": 0}
students.append(new_student)

for s in students[:3]:
print(s)

字典中存列表

值可以是列表,适合一个人有多个属性:

member = {
"name": "Alice",
"skills": ["Python", "PyTorch", "Docker"],
}

print(f"{member['name']} 会的技术:")
for skill in member["skills"]:
print(f" - {skill}")

字典中存字典

适合存储层级结构,比如社团里的用户信息:

users = {
"alice_2024": {
"first": "Alice",
"last": "Wang",
"department": "AI",
},
"bob_2023": {
"first": "Bob",
"last": "Li",
"department": "CV",
},
}

for username, info in users.items():
full_name = f"{info['first']} {info['last']}"
print(f"{username}: {full_name} ({info['department']})")

嵌套层级不要太深,一般两三层就够了。太深的话代码难读,可以考虑用类或者数据库来替代。