文章目录
字典(dict)是 Python 中最重要、最常用的内置数据结构之一,用于存储 键值对(key-value pairs) 数据。
1. 字典的基本特性
1、无序集合(Python 3.7+ 后按插入顺序保存)
2、可变(可动态增删改)
3、键必须唯一且不可变(如字符串、数字、元组)
4、值可以是任意类型(包括其他字典)
2. 创建字典
# 方式1:花括号
d1 = {'name': 'Alice', 'age': 25}
# 方式2:dict()构造函数
d2 = dict(name='Bob', age=30)
# 方式3:键值对列表
d3 = dict([('name', 'Charlie'), ('age', 35)])
# 空字典
empty_dict = {}
3. 字典操作
访问元素
person = {'name': 'Alice', 'age': 25}
# 获取值
print(person['name']) # 'Alice'
# 使用get()方法(避免KeyError)
print(person.get('age')) # 25
print(person.get('height')) # None
print(person.get('height', 170)) # 默认值170
添加/修改元素
person['age'] = 26 # 修改
# city是原本没有的键
person['city'] = 'NY' # 新增
删除元素
del person['city'] # 删除键值对
age = person.pop('age') # 删除并返回值
person.clear() # 清空字典
4. 常用方法
方法 | 描述 |
---|---|
keys() | 返回所有键 |
values() | 返回所有值 |
items() | 返回所有键值对 |
update() | 合并字典 |
setdefault() | 安全获取/设置值 |
popitem() | 移除最后插入的项 |
len() | 返回字典中 键值对(key-value pairs)的数量 |
person = {'name': 'Alice', 'age': 25}
# 遍历
for key in person: ...
for value in person.values(): ...
for key, value in person.items(): ...
# 合并字典
extra_info = {'city': 'NY', 'job': 'Engineer'}
person.update(extra_info)
my_dict = {'a': 1, 'b': 2, 'c': 3}
# 计算字典的长度(键值对数量)
print(len(my_dict)) # 输出: 3
# 空字典的情况
empty_dict = {}
print(len(empty_dict)) # 输出: 0
items详细介绍
在 Python 中,字典(dict)的 items() 方法返回一个 视图对象(dict_items 类型),它包含字典中所有的键值对((key, value) 元组)。这个视图是动态的,会反映字典的实时变化。
tuple1 = person.items()
print(tuple1)
# items返回值是实时变化的
person['city'] = 'NY'
print(tuple1)
输出结果:
dict_items([('name', 'Alice'), ('age', 25)])
dict_items([('name', 'Alice'), ('age', 25), ('city', 'NY')])
pop和popitem的区别
这两个方法都用于从字典中移除并返回元素,但有重要区别:
pop(key[, default])
1、移除指定键的元素并返回其值
2、必须指定要移除的键,如果键不存在:
2.1、不提供默认值:引发 KeyError
2.2、提供默认值:返回默认值而不报错
popitem()
1、移除并返回最后插入的键值对 (Python 3.7+),在 Python 3.6 及之前版本,popitem() 移除的是随机项,不是最后插入的
2、不需要参数
3、字典为空时引发 KeyError
4、返回形式为 (key, value) 元组
主要区别总结
特性 | pop() | popitem() |
---|---|---|
参数需求 | 必须指定key | 不需要参数 |
返回值 | 只返回值 | 返回(key, value)元组 |
空字典行为 | 键不存在时可能报错 | 必定报错 |
移除位置 | 指定键 | 最后插入的项(LIFO) |
Python版本影响 | 所有版本行为一致 | 3.7+才保证LIFO顺序 |
典型用途 | 移除特定元素 | 实现栈/缓存淘汰 |
setdefault方法
setdefault用于获取字典中指定键的值,如果键不存在,则会设置默认值并返回该默认值。
setdefalut与get的区别
get()方法在键不存在时返回默认值但不会修改字典
setdefault()方法在键不存在时会修改字典,添加键值对
5. 字典推导式
类似列表推导式:
squares = {x: x*x for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
6. 查找键值是否存在
1. 使用 in 关键字(推荐)
my_dict = {'name': 'Alice', 'age': 25}
if 'name' in my_dict:
print("键 'name' 存在") # 会执行
if 'gender' not in my_dict:
print("键 'gender' 不存在") # 会执行
2. 使用 get() 方法
my_dict = {'name': 'Alice', 'age': 25}
# 如果键存在,返回对应的值;不存在则返回None(或指定的默认值)
value = my_dict.get('name')
if value is not None:
print(f"键 'name' 存在,值为 {value}")
3. 使用 keys() 方法
my_dict = {'name': 'Alice', 'age': 25}
if 'age' in my_dict.keys():
print("键 'age' 存在")
4. 使用 try-except 块
my_dict = {'name': 'Alice', 'age': 25}
try:
value = my_dict['gender']
except KeyError:
print("键 'gender' 不存在")
性能比较
1、in 操作符是最快和最Pythonic的方式
2、get() 方法在需要同时获取值时很方便
3、keys() 方法在Python 3中与直接使用in性能相同(因为keys()返回的是视图对象)
4、try-except 适用于预期键通常存在的情况
7. 特殊字典类型
collections模块中的特殊类型,有兴趣可以自己去搜索,博主在这里就不带着大家一块学习了。
collections.defaultdict:带默认值的字典
collections.OrderedDict:保持插入顺序的字典
collections.Counter:计数器专用字典
8. 注意事项
1、检查键是否存在:if key in dict 比 try-except 更高效
2、字典键必须是可哈希的(不可变类型)
3、Python 3.7+ 中字典保持插入顺序
4、不允许用下表查找
9. 应用场景
如JSON数据处理、配置存储。