字典(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数据处理、配置存储。

更多推荐