常用数据结构之字典
常用数据结构之字典(Dictionary)
什么是字典(Dictionary)
**字典(dict)**是 Python 中非常重要的数据结构之一,它以“键值对(key-value)”的形式来组织和存储数据。与列表、元组、集合相比,字典具有更强的“语义性”和“检索效率”,适合用来描述具有多个属性的对象,或者快速查找、映射、计数等任务。
字典的结构类似于现实生活中的《新华字典》:“字”是键,“解释”是值。
适用场景
✅ 场景1:描述现实中的实体对象
person = {
'name': '王大锤',
'age': 55,
'height': 168,
'weight': 60,
'addr': '成都市武侯区科华北路62号1栋101',
'tel': '13122334455',
'emergency_contact': '13800998877'
}
最佳实践:用字典保存实体对象的多个属性,避免用列表或元组带来的索引混乱。
字典的创建方法
方法1:使用花括号 {}
和冒号 :
xinhua = {'麓': '山脚下', '蕗': '甘草的别名'}
方法2:使用 dict()
构造器
person = dict(name='王大锤', age=55, height=168)
方法3:使用 zip()
函数压缩两个列表/元组
codes = dict(zip('ABCDE', range(1, 6)))
方法4:字典推导式(生成式)
squares = {x: x**2 for x in range(1, 6)}
字典的基本操作
查看长度
len(person) # 返回键值对的数量
索引访问(取值、赋值、添加)
person['age'] # 访问键为 'age' 的值
person['age'] = 30 # 修改值
person['gender'] = '男' # 添加新的键值对
键是否存在(成员运算)
'name' in person # True
'tel' in person # False
遍历字典
遍历键
for key in person:
print(key)
遍历值
for value in person.values():
print(value)
遍历键值对
for key, value in person.items():
print(f'{key}:\t{value}')
字典的常用方法与用法示例
方法名 | 功能说明 | 示例 |
---|---|---|
get(key, default) |
获取指定键的值,如果不存在则返回默认值 | person.get('sex', '未知') |
keys() |
返回所有键(可迭代) | person.keys() |
values() |
返回所有值(可迭代) | person.values() |
items() |
返回所有键值对(二元组) | person.items() |
update(dict2) |
合并另一个字典,重复键会更新 | person.update({'age': 30}) |
pop(key) |
删除指定键,并返回它的值 | person.pop('age') |
popitem() |
随机删除一个键值对,返回的是(key, value)元组 | person.popitem() |
clear() |
清空整个字典 | person.clear() |
del dict[key] |
删除指定键对应的数据,键不存在则抛异常 | del person['addr'] |
字典中的键必须是不可变类型
可作为键的类型包括:
- 整型(int)
- 字符串(str)
- 元组(tuple,内容不可变)
不可作为键的类型包括:
- 列表(list)
- 集合(set)
- 字典(dict)
✅ 示例(正确):
d = {(1, 2): '坐标', 'name': 'Alice'}
❌ 示例(错误):
d = {[1, 2]: '非法键'} # 报错:unhashable type: 'list'
字典的嵌套使用与结构建模
字典可以嵌套字典、列表等数据结构来描述更复杂的数据:
person = {
'name': '王大锤',
'addr': ['成都', '北京'],
'car': {
'brand': 'BMW',
'specs': {'length': 5170, 'width': 2000}
}
}
实战案例:字典的经典应用场景
案例1:英文字符统计器(频率统计)
sentence = input("请输入英文段落: ")
counter = {}
for ch in sentence:
if ch.isalpha():
counter[ch] = counter.get(ch, 0) + 1
for k in sorted(counter, key=counter.get, reverse=True):
print(f'{k}: {counter[k]}')
使用场景:统计类、数据可视化、文本分析。
案例2:筛选高股价股票
stocks = {
'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24,
'ORCL': 48.44, 'ACN': 166.89, 'FB': 208.09
}
expensive = {k: v for k, v in stocks.items() if v > 100}
print(expensive)
使用场景:数据筛选、条件映射、过滤处理。
最佳实践建议
- ✅ 使用语义化的键名:不要用 'a1'、'b2' 之类的无意义键名。
- ✅ 使用
get()
获取值更安全:避免KeyError
异常。 - ✅ 结合字典推导式使用过滤与转换逻辑。
- ✅ 字典适合做映射、存储配置项、实体建模、统计分析。
- ✅ 结合 JSON 存储与读取更强大:字典是 JSON 的天然数据结构。
总结回顾
- 字典是 Python 中最强大的数据结构之一。
- 它支持键值对的形式,键必须是不可变类型。
- 可以用于实体建模、数据映射、统计、嵌套结构。
- 掌握字典的各种创建方式、访问技巧和方法操作,是成为中级 Python 开发者的必经之路。
📌 一句话总结:
字典让数据结构变得更有语义、更易读写、更适合组织和查询现实世界中的复杂信息。
如需进一步学习,请结合项目实战中使用字典的情景来练习,如用户信息管理系统、成绩统计器、JSON 配置加载等场景。