当前位置:首页>python>Python字典全解:从基础用法到冷门高阶技巧,开发必备干货

Python字典全解:从基础用法到冷门高阶技巧,开发必备干货

  • 2026-10-11 07:36:34
Python字典全解:从基础用法到冷门高阶技巧,开发必备干货

字典是Python中以键值对(key: value) 存储数据的核心数据结构,凭借查询速度快、使用灵活的特点,成为日常开发、数据处理中出场率最高的类型之一。

很多小伙伴只会基础的取值、赋值操作,却忽略了大量能大幅提升编码效率的实用方法。今天这篇文章,整合基础常用方法+冷门高阶技巧,零基础也能看懂,新手入门、职场进阶、面试备考都适用。


一、字典基础认知

1. 定义规则

字典使用大括号 {} 包裹,内部由一个个键: 值组成。

  • 键(key):必须唯一,且为不可变类型(字符串、数字、元组),列表、字典不能作为键;
  • 值(value):无类型限制,数字、字符串、列表、对象等都可以,允许重复。
# 标准字典定义
person = {
"name": "小明",
"age": 20,
"city": "北京"
}

二、日常开发高频常用方法

这部分是入门必学内容,也是代码中使用最多的基础操作,建议熟练掌握。

1. 元素取值

两种主流取值方式,适用场景不同:

  1. 直接通过键取值:键不存在时会直接抛出异常;
  2. 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提供四种删除方式,按需选择即可:

  • del:删除指定键值对,也可直接删除整个字典;
  • pop():删除指定键,并返回被删除的值;
  • popitem():删除字典最后一组键值对(Python3.7+版本字典有序);
  • clear():清空字典所有元素,保留空字典。
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. 统计长度 & 判断键是否存在

  • len():统计字典内键值对的总数;
  • in 关键字:判断某个键是否存在于字典中。
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 |= 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': '北京'}

四、内容总结

  1. 基础核心:日常开发优先掌握get()、items()、update()、增删改查基础操作,是编码必备能力;
  2. 效率提升:字典推导式、setdefault()进阶用法、|合并运算符,能大幅精简代码;
  3. 场景专属:
    • 数据统计/分组 → 用 defaultdict;
    • 配置常量防篡改 → 用 MappingProxyType;
    • 字典排序 → 结合 sorted() 实现;
  4. 避坑要点:普通字典取值优先用get(),减少代码报错;字典的键必须为不可变类型。

字典作为Python的核心数据结构,吃透基础+高阶用法,不管是日常写代码、做数据分析,还是应对面试,都能游刃有余。建议大家动手运行示例代码,加深理解哦!

最新文章

随机文章