
今天我们来学习字典,在Python中,字典(dictionary)是一系列键值对。键必须是不可变类型(如字符串、数字、元组),且必须是唯一的,而值可以是任意类型。
一、字典的创建
基本语法:字典变量 = { key:value,key1:value1,key2:value2}
python
# 方法1: 花括号直接创建
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
print(person) # {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 方法2: dict()构造函数
student = dict(name='Bob', age=22, major='CS')
print(student) # {'name': 'Bob', 'age': 22, 'major': 'CS'}
# 方法3: 从键值对列表创建
pairs = [('name', 'Charlie'), ('age', 30), ('city', 'Shanghai')]
person3 = dict(pairs)
print(person3) # {'name': 'Charlie', 'age': 30, 'city': 'Shanghai'}
# 方法4: 字典推导式
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
二、访问字典元素
字典可以通过 dictionary[key]来访问元素,但通常不建议你这么做,因为当你访问字典中没有的key时就会报错,可以使用dictionary.get(key)方式来访问,如果找不到元素会返回None。
python
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 方法1: 方括号访问
print(person['name']) # Alice
# print(person['gender']) # KeyError: 'gender' (键不存在会报错)
# 方法2: get()方法(推荐)
print(person.get('name')) # Alice
print(person.get('gender')) # None (键不存在返回None)
print(person.get('gender', '未知')) # 未知 (设置默认值)
# 方法3: setdefault()访问并设置默认值
gender = person.setdefault('gender', 'female')
print(gender) # female
print(person) # {'name': 'Alice', 'age': 25, 'city': 'Beijing', 'gender': 'female'}
三、字典元素的增删改
可以单个修改元素,也可以使用update()方法批量修改元素的值。
python
# 创建字典
person = {'name': 'Alice', 'age': 25}
# 添加新键值对
person['city'] = 'Beijing'
print(person) # {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 修改已有键的值
person['age'] = 26
print(person) # {'name': 'Alice', 'age': 26, 'city': 'Beijing'}
# 批量更新
person.update({'job': 'Engineer', 'salary': 8000})
print(person) # {'name': 'Alice', 'age': 26, 'city': 'Beijing', 'job': 'Engineer', 'salary': 8000}
删除的方法主要有del、pop()、clear()方法
python
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing', 'job': 'Engineer'}
# 方法1: del语句
del person['age']
print(person) # {'name': 'Alice', 'city': 'Beijing', 'job': 'Engineer'}
# 方法2: pop()删除并返回值
city = person.pop('city')
print(city) # Beijing
print(person) # {'name': 'Alice', 'job': 'Engineer'}
# 方法4: clear()清空字典
person.clear()
print(person) # {}
四、获取所有键值对,仅获取键或值
1.直接获取键值对
python
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 获取所有键
keys = person.keys()
print(keys) # dict_keys(['name', 'age', 'city'])
print(list(keys)) # ['name', 'age', 'city']
# 获取所有值
values = person.values()
print(values) # dict_values(['Alice', 25, 'Beijing'])
print(list(values)) # ['Alice', 25, 'Beijing']
# 获取所有键值对
items = person.items()
print(items) # dict_items([('name', 'Alice'), ('age', 25), ('city', 'Beijing')])
print(list(items)) # [('name', 'Alice'), ('age', 25), ('city', 'Beijing')]
2.for循环遍历键值对
python
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 遍历所有键值对
for key, value in person.items():
print(f'{key}:{value}',end=' ') #输出:name:Alice age:25 city:Beijing
print()
# 遍历所有键
for key in person.keys():
print(f'{key}',end=' ') #输出:name age city
print()
# 遍历所有值
for value in person.values(): #输出:Alice 25 Beijing
print(f'{value}',end=' ')
3.带条件的遍历
里面使用了字典推导式
python
scores = {'张三': 85, '李四': 72, '王五': 90,}
# 找出成绩大于80的学生
top_students = {name: score for name, score in scores.items() if score > 80}
print(top_students) # {'张三': 85, '王五': 90}
# 遍历时修改值
for name in scores:
scores[name] = scores[name] + 5 # 每人加5分
print(scores) # {'张三': 90, '李四': 77, '王五': 95}
五、检查键是否存在
python
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 方法1: in操作符
print('name' in person) # True
print('gender' in person) # False
# 方法2: keys()方法
print('name' in person.keys()) # True
六、字典长度和拷贝
python
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
# 字典长度
print(len(person)) # 3
# 浅拷贝
person_copy = person.copy()
person_copy['age'] = 30
print(person) # {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
print(person_copy) # {'name': 'Alice', 'age': 30, 'city': 'Beijing'}
七、字典推导式
回忆一下列表推导式,字典推导式和列表推导式的差别是:列表是1个变量,字典是2个变量。
基本语法: {key_expression: value_expression for item in iterable if condition}
- key_expression:value_expression:一个键值对表达式,用于计算新字典中的元素。
- for item in iterable:循环部分,从可迭代对象中取出每个元素。
- if condition:可选,过滤条件,只有满足条件的元素才会被处理并放入新列表。
python
# 示例1: 创建平方字典
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# 示例2: 转换字典键值
original = {'a': 1, 'b': 2, 'c': 3}
inverted = {value: key for key, value in original.items()}
print(inverted) # {1: 'a', 2: 'b', 3: 'c'}
# 示例3: 过滤字典
scores = {'Alice': 85, 'Bob': 72, 'Charlie': 90, 'David': 65}
passed = {name: score for name, score in scores.items() if score >= 70}
print(passed) # {'Alice': 85, 'Bob': 72, 'Charlie': 90}
# 示例4: 修改字典值
students = {'Alice': 85, 'Bob': 72, 'Charlie': 90}
adjusted = {name: score+5 for name, score in students.items()}
print(adjusted) # {'Alice': 90, 'Bob': 77, 'Charlie': 95}
八、嵌套字典
字典中的值还是字典,运用两个索引进行读取。
python
# 学生信息嵌套字典
students = {
'Alice': {
'age': 20,
'grades': [85, 92, 78],
'major': 'CS'
},
'Bob': {
'age': 22,
'grades': [70, 65, 80],
'major': 'Math'
},
'Charlie': {
'age': 21,
'grades': [95, 88, 92],
'major': 'Physics'
}
}
# 访问嵌套字典
print(students['Alice']['age']) # 20
print(students['Bob']['grades'][0]) # 70
# 修改嵌套字典
students['Alice']['grades'].append(90)
print(students['Alice']['grades']) # [85, 92, 78, 90]
# 添加新学生
students['David'] = {'age': 23, 'grades': [65, 70, 75], 'major': 'Chemistry'}
# 遍历嵌套字典
for name, info in students.items():
print(f"姓名: {name}")
print(f" 年龄: {info['age']}")
print(f" 专业: {info['major']}")
print(f" 平均分: {sum(info['grades']) / len(info['grades']):.1f}")
九、列表、元组和字典的区别
| 特性 | 列表 (List) | 元组 (Tuple) | 字典 (Dict) |
|---|---|---|---|
| 定义 | 有序的可变序列 | 有序的不可变序列 | 无序的键值对集合(Python 3.7+保持插入顺序) |
| 表示方式 | 方括号 [] |
圆括号 () |
花括号 {} |
| 可变性 | ✅ 可变 | ❌ 不可变 | ✅ 可变 |
| 有序性 | ✅ 有序 | ✅ 有序 | ❌ 无序(但Python 3.7+保持插入顺序) |
| 元素访问 | 索引(从0开始) | 索引(从0开始) | 键(key) |
| 元素类型 | 任意类型 | 任意类型 | 键:不可变类型 值:任意类型 |
| 重复元素 | ✅ 允许 | ✅ 允许 | 键:❌ 不允许 值:✅ 允许 |
| 创建方式 | list() 或 [] |
tuple() 或 () |
dict() 或 {} |
| 内存占用 | 较小 | 最小(因为不可变) | 较大(哈希表结构) |
| 查找速度 | O(n) 线性查找 | O(n) 线性查找 | O(1) 哈希查找 |
| 常用方法 | append(), pop(), sort(), reverse() |
count(), index() |
keys(), values(), items(), get() |
| 推导式 | 列表推导式 [x for x in ...] |
元组推导式(返回生成器) (x for x in ...) |
字典推导式 {k:v for ...} |
| 适用场景 | 数据集合,需要增删改查 | 固定数据集合,作为字典键或函数返回值 | 键值对映射,快速查找 |
| 示例 | [1, 2, 3, 'a'] |
(1, 2, 3, 'a') |
{'a': 1, 'b': 2} |