一、什么是字典?
字典(dictionary) 是 Python 中一种非常强大的数据结构,用于存储键值对(key-value pairs)。每个键都与一个值相关联,可以通过键来快速访问对应的值,类似于现实生活中的字典:通过词条(键)查找释义(值)。
# 字典示例person = {"name": "张三", "age": 25, "city": "北京"}print(person["name"]) # 输出:张三
二、字典的特点
- • 键值对:每个元素由键和值组成,用冒号
: 分隔。 - • 键唯一:字典中的键不能重复,如果重复赋值,后面的值会覆盖前面的。
- • 键必须不可变:键可以是数字、字符串、元组等不可变类型,但不能是列表或字典(可变类型)。
- • 值可以是任意类型:值可以是数字、字符串、列表、字典甚至自定义对象。
- • 无序性(但有序):在 Python 3.6 之前,字典是无序的;从 3.7 开始,字典会保持插入顺序,但通常我们仍将字典视为无序的键值对集合(因为访问时不依赖顺序)。
- • 高效:字典的查找速度非常快(基于哈希表实现)。
三、创建字典
3.1 使用花括号 {}
最常见的方式是用花括号括起一系列用逗号分隔的键值对,每个键值对格式为 键: 值。
# 空字典empty_dict = {}# 包含多个键值对的字典student = {"name": "李四","age": 20,"major": "计算机科学"}print(student)
3.2 使用 dict() 构造函数
dict() 函数可以通过多种方式创建字典。
方式1:传入关键字参数
person = dict(name="王五", age=30, city="上海")print(person) # {'name': '王五', 'age': 30, 'city': '上海'}
注意:这种方式下,键名必须是合法的标识符(不能是数字、带空格等)。
方式2:传入包含键值对的元组/列表
# 传入包含键值对元组的列表items = [("name", "赵六"), ("age", 28), ("city", "广州")]person = dict(items)print(person) # {'name': '赵六', 'age': 28, 'city': '广州'}# 也可以传入键值对的元组列表,或者使用 zipkeys = ["name", "age", "city"]values = ["小明", 18, "深圳"]person = dict(zip(keys, values))print(person) # {'name': '小明', 'age': 18, 'city': '深圳'}
方式3:使用字典推导式(后续会详细介绍,这里只作简单示例)
# 生成数字平方字典squares = {x: x**2for x inrange(5)}print(squares) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
3.3 使用 fromkeys() 方法
dict.fromkeys(seq, value) 用于创建一个新字典,以序列 seq 中的元素作为键,所有键对应的值相同(默认为 None)。
# 所有键的值默认为 Nonekeys = ["a", "b", "c"]d = dict.fromkeys(keys)print(d) # {'a': None, 'b': None, 'c': None}# 指定默认值d = dict.fromkeys(keys, 0)print(d) # {'a': 0, 'b': 0, 'c': 0}
注意: 如果默认值是可变对象(如列表),所有键将共享同一个对象,修改一个会影响到所有键,需谨慎。
四、访问字典元素
4.1 通过键直接访问 字典[键]
使用方括号加键名即可获取对应的值。如果键不存在,会抛出 KeyError。
student = {"name": "小红", "age": 19, "score": 95}print(student["name"]) # 小红print(student["age"]) # 19# print(student["gender"]) # KeyError: 'gender'
4.2 使用 get() 方法安全访问
get(key[, default]) 方法在键存在时返回对应的值,不存在时返回 default(默认 None),不会抛出异常。
student = {"name": "小红", "age": 19, "score": 95}print(student.get("name")) # 小红print(student.get("gender")) # Noneprint(student.get("gender", "未知")) # 未知(指定默认值)
4.3 检查键是否存在 —— in 运算符
在访问前可以使用 in 或 not in 检查字典中是否包含某个键。
student = {"name": "小红", "age": 19}if"name"in student:print("存在 name 键")if"gender"notin student:print("不存在 gender 键")
4.4 获取所有键、值、键值对
- •
keys() 返回所有键的视图(类似集合,支持迭代)。 - •
items() 返回所有键值对的视图,每个元素是一个元组 (键, 值)。
student = {"name": "小明", "age": 20, "city": "北京"}print(student.keys()) # dict_keys(['name', 'age', 'city'])print(student.values()) # dict_values(['小明', 20, '北京'])print(student.items()) # dict_items([('name', '小明'), ('age', 20), ('city', '北京')])# 可以转换为列表keys_list = list(student.keys())print(keys_list) # ['name', 'age', 'city']
4.5 遍历字典
通常使用 for 循环遍历字典,可以直接遍历键,或遍历 items() 同时获取键和值。
student = {"name": "小刚", "age": 22, "score": 88}# 遍历键for key in student:print(f"{key}: {student[key]}")# 遍历键值对for key, value in student.items():print(f"{key}: {value}")
4.6 访问嵌套字典的值
如果字典的值也是字典(嵌套字典),可以使用连续的中括号访问。
users = {"user1": {"name": "张三", "age": 25},"user2": {"name": "李四", "age": 30}}print(users["user1"]["name"]) # 张三
五、常用操作速览
| | |
| d = {} | |
| d[键] = 值 | d["name"] = "Tom" |
| d[键] | |
| del d[键] | del d["age"] |
| d.pop(键[, 默认]) | age = d.pop("age") |
| d.clear() | |
| d1.update(d2) | d1.update({"a":1}) |
| d.keys() | |
| d.values() | |
| d.items() | |
| 键 in d | |
| len(d) | |
六、注意事项
- 1. 键必须是不可变类型:如整数、浮点数、字符串、元组。列表、字典等可变类型不能作为键。
- 2. 键不能重复:如果重复赋值,后面的值会覆盖前面的。
- 3. 访问不存在的键:用
d[键] 会引发 KeyError,推荐使用 d.get(键) 避免异常。 - 4. 字典视图动态性:
keys()、values()、items() 返回的视图会随字典变化而变化,且支持集合运算(对 keys() 和 items())。 - 5. Python 3.7+ 字典保持插入顺序:虽然可以作为特性使用,但不应依赖顺序进行逻辑判断(除非明确需要)。
七、实战案例
案例1:学生信息管理系统
# 存储多个学生信息students = {}whileTrue:print("\n1. 添加学生")print("2. 查询学生")print("3. 显示所有学生")print("0. 退出") choice = input("请选择:")if choice == '1': sid = input("学号:") name = input("姓名:") age = input("年龄:") students[sid] = {"name": name, "age": age}print("添加成功")elif choice == '2': sid = input("学号:")if sid in students: info = students[sid]print(f"姓名:{info['name']},年龄:{info['age']}")else:print("学号不存在")elif choice == '3':for sid, info in students.items():print(f"{sid}: {info['name']},{info['age']}岁")elif choice == '0':break
案例2:统计字符出现次数
text = "hello world"char_count = {}for ch in text:if ch != ' ': char_count[ch] = char_count.get(ch, 0) + 1print(char_count) # {'h': 1, 'e': 1, 'l': 3, 'o': 2, 'w': 1, 'r': 1, 'd': 1}
案例3:使用字典映射执行不同操作(替代 if-elif)
defadd(a, b):return a + bdefsubtract(a, b):return a - bdefmultiply(a, b):return a * boperations = {'+': add,'-': subtract,'*': multiply}a, b = 10, 5for op in operations: result = operations[op](a, b)print(f"{a}{op}{b} = {result}")
八、总结
- • 字典 是键值对的无序(但有序)集合,键唯一且不可变。
- • 创建方式:
{}、dict()、fromkeys()、字典推导式。 - • 访问元素:
d[键](可能引发异常)和 d.get(键, 默认值)(安全)。 - • 常用方法:
keys()、values()、items()、update()、pop() 等。
掌握字典是 Python 编程的基本功,它能让你以键值对的方式组织数据,代码更清晰高效。