字典是Python中以键值对(key: value) 存储数据的核心数据结构,凭借查询速度快、使用灵活的特点,成为日常开发、数据处理中出场率最高的类型之一。
很多小伙伴只会基础的取值、赋值操作,却忽略了大量能大幅提升编码效率的实用方法。今天这篇文章,整合基础常用方法+冷门高阶技巧,零基础也能看懂,新手入门、职场进阶、面试备考都适用。
一、字典基础认知
1. 定义规则
字典使用大括号 {} 包裹,内部由一个个键: 值组成。
- 键(key):必须唯一,且为不可变类型(字符串、数字、元组),列表、字典不能作为键;
- 值(value):无类型限制,数字、字符串、列表、对象等都可以,允许重复。
# 标准字典定义
person = {
"name": "小明",
"age": 20,
"city": "北京"
}
二、日常开发高频常用方法
这部分是入门必学内容,也是代码中使用最多的基础操作,建议熟练掌握。
1. 元素取值
两种主流取值方式,适用场景不同:
get() 方法取值:键不存在默认返回None,也可自定义默认值,推荐日常使用。
person = {"name": "小明", "age": 20}
# 方式1:直接取值
print(person["name"]) # 小明
# 方式2:get() 安全取值
print(person.get("age")) # 20
print(person.get("gender")) # 键不存在,返回 None
print(person.get("gender", "未知")) # 设置默认返回值:未知
2. 获取键、值、键值对集合
通过三个内置方法,可以分别提取字典的所有键、所有值、全部键值对,是字典遍历的基础。
person = {"name": "小明", "age": 20, "city": "北京"}
print(person.keys()) # 获取所有键:dict_keys(['name', 'age', 'city'])
print(person.values()) # 获取所有值:dict_values(['小明', 20, '北京'])
print(person.items()) # 获取所有键值对:dict_items([('name', '小明'), ('age', 20), ('city', '北京')])
# 经典遍历写法(工作最常用)
for k, v in person.items():
print(f"键:{k},值:{v}")
3. 添加 & 修改元素
字典中键具有唯一性:键不存在则为新增元素,键已存在则覆盖原有值。
person = {"name": "小明"}
# 新增键值对
person["age"] = 20
# 修改已有键的值
person["name"] = "小红"
print(person) # {'name': '小红', 'age': 20}
4. update() 批量更新字典
当需要一次性合并多个键值对时,使用update()方法,可快速批量新增/修改元素。
person = {"name": "小明"}
info = {"age": 20, "city": "上海"}
person.update(info)
print(person) # {'name': '小明', 'age': 20, 'city': '上海'}
5. 删除元素
Python提供四种删除方式,按需选择即可:
popitem():删除字典最后一组键值对(Python3.7+版本字典有序);
person = {"name": "小明", "age": 20, "city": "北京"}
# del 删除指定键
del person["age"]
# pop() 删除并返回值
res = person.pop("city")
print(res) # 北京
# popitem() 删除末尾元素
person.popitem()
# clear() 清空字典
person.clear()
print(person) # {}
6. copy() 复制字典
copy() 实现浅拷贝,复制后的新字典和原字典相互独立,修改互不影响。
person = {"name": "小明"}
new_person = person.copy()
new_person["age"] = 18
print(person) # {'name': '小明'}
print(new_person) # {'name': '小明', 'age': 18}
7. fromkeys() 快速批量建字典
基于一组键,快速生成所有值相同的字典,适合初始化配置类数据。
key_list = ["name", "age", "city"]
user = dict.fromkeys(key_list, "未知")
print(user) # {'name': '未知', 'age': '未知', 'city': '未知'}
8. setdefault() 智能取值/新增
功能结合了取值+新增:键存在则返回对应值;键不存在则新增该键,并设置默认值。
person = {"name": "小明"}
print(person.setdefault("name")) # 键存在,返回值:小明
person.setdefault("age", 18) # 键不存在,新增键值对
print(person) # {'name': '小明', 'age': 18}
9. 统计长度 & 判断键是否存在
person = {"name": "小明", "age": 20}
print(len(person)) # 统计数量:2
print("name"in person) # 判断键是否存在:True
print("gender"in person) # False
三、冷门但超实用的高阶技巧
掌握完基础用法,再来学习这些使用率不高,但关键时刻能简化代码、解决特殊场景的高阶方法,提升代码专业性和效率。
1. contains():判断键存在(底层方法)
in 关键字的底层实现方法,功能和in完全一致,了解原理即可。
d = {"name": "小明"}
print(d.__contains__("name")) # True
2. setdefault() 进阶玩法:给字典内列表追加数据
经典实战用法,一行代码实现列表元素追加,不用额外判断键是否存在。
data = {}
# 键不存在则创建空列表,再追加元素
data.setdefault("num_list", []).append(1)
data.setdefault("num_list", []).append(2)
print(data) # {'num_list': [1, 2]}
3. | 和 |= 运算符:优雅合并字典(Python3.9+)
Python3.9及以上版本新增运算符,是目前最简洁的字典合并方式。
a | b:合并两个字典,不修改原字典,返回新字典;
a = {"name": "小明"}
b = {"age": 20}
# 生成新字典,原字典不变
c = a | b
print(c) # {'name': '小明', 'age': 20}
# 原地合并,修改原字典
a |= b
print(a) # {'name': '小明', 'age': 20}
4. sorted() 对字典排序
字典本身无序(Python3.7+保留插入顺序),如需按键/值排序,结合sorted()实现,面试和数据处理高频考点。
d = {"b": 2, "a": 1, "c": 3}
# 按键升序排序
sort_by_key = dict(sorted(d.items()))
print(sort_by_key) # {'a': 1, 'b': 2, 'c': 3}
# 按值升序排序
sort_by_value = dict(sorted(d.items(), key=lambda x: x[1]))
print(sort_by_value) # {'a': 1, 'b': 2, 'c': 3}
5. collections.defaultdict:带默认值的字典
普通字典访问不存在的键会报错,defaultdict可以提前指定值的默认类型,彻底避免KeyError异常,常用于数据统计、分组。
from collections import defaultdict
# 默认值为数字 0,适合计数
count_dict = defaultdict(int)
count_dict["apple"] += 1
print(count_dict["apple"]) # 1
# 默认值为空列表,适合分组存储数据
group_dict = defaultdict(list)
group_dict["class1"].append("张三")
print(group_dict) # {'class1': ['张三']}
6. types.MappingProxyType:生成只读字典
将普通字典转为只读模式,只能读取数据,无法新增、修改、删除元素,适合存放系统配置、常量数据,防止数据被意外篡改。
from types import MappingProxyType
origin_dict = {"version": "1.0", "author": "python"}
read_only_dict = MappingProxyType(origin_dict)
print(read_only_dict["version"]) # 正常读取:1.0
# read_only_dict["version"] = "2.0" # 报错,无法修改
7. 进阶字典推导式
字典推导式可以快速生成、过滤、转换字典,代码简洁高效,分为条件过滤、键值互换等场景。
# 1. 基础推导式:根据列表生成字典
num_list = [1, 2, 3]
new_dict = {x: x**2for x in num_list}
print(new_dict) # {1: 1, 2: 4, 3: 9}
# 2. 带条件过滤的推导式
old_dict = {"a": 1, "b": 2, "c": 3}
filter_dict = {k: v for k, v in old_dict.items() if v > 1}
print(filter_dict) # {'b': 2, 'c': 3}
# 3. 字典键值互换
swap_dict = {v: k for k, v in old_dict.items()}
print(swap_dict) # {1: 'a', 2: 'b', 3: 'c'}
8. ** 解包合并字典
兼容低版本Python的字典合并方案,通用性极强。
d1 = {"name": "小明"}
d2 = {"age": 20, "city": "北京"}
merge_dict = {**d1, **d2}
print(merge_dict) # {'name': '小明', 'age': 20, 'city': '北京'}
四、内容总结
- 基础核心:日常开发优先掌握
get()、items()、update()、增删改查基础操作,是编码必备能力; - 效率提升:字典推导式、
setdefault()进阶用法、|合并运算符,能大幅精简代码; - 配置常量防篡改 → 用
MappingProxyType;
- 避坑要点:普通字典取值优先用
get(),减少代码报错;字典的键必须为不可变类型。
字典作为Python的核心数据结构,吃透基础+高阶用法,不管是日常写代码、做数据分析,还是应对面试,都能游刃有余。建议大家动手运行示例代码,加深理解哦!