坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭: “不患无位,患所以立。”
#Python学习之字典(二):高级操作与实战技巧
摘要
在上一篇文章中,我们介绍了Python字典的基础知识。本篇将深入探讨字典的高级操作,包括遍历技巧、视图对象、合法键类型以及实际应用场景,帮助你全面掌握这一强大的数据结构。
目录
一、遍历字典元素
字典的遍历操作是日常编程中的常见需求。Python提供了多种方法来遍历字典的键、值或键值对。
1.遍历所有键
最基本的遍历方式是直接遍历字典对象,这将返回字典中的所有键:
student = {
'name': '张三',
'age': 20,
'major': '计算机科学',
'gpa': 3.8
}
# 直接遍历字典
for key in student:
print(key) # 输出: name, age, major, gpa
# 使用keys()方法
for key in student.keys():
print(key) # 输出: name, age, major, gpa
这两种方式在功能上是等价的,但使用keys()
方法可以使代码意图更加明确。
2.遍历所有值
如果只需要访问字典中的值,可以使用values()
方法:
student = {
'name': '张三',
'age': 20,
'major': '计算机科学',
'gpa': 3.8
}
# 遍历所有值
for value in student.values():
print(value) # 输出: 张三, 20, 计算机科学, 3.8
# 计算所有数值类型值的总和
total = sum(value for value in student.values() if isinstance(value, (int, float)))
print(f"数值总和: {total}") # 输出: 数值总和: 23.8
values()
方法返回一个包含字典所有值的视图对象,使我们能够直接遍历这些值。
3.同时遍历键和值
要同时访问键和对应的值,可以使用items()
方法:
student = {
'name': '张三',
'age': 20,
'major': '计算机科学',
'gpa': 3.8
}
# 同时遍历键和值
for key, value in student.items():
print(f"{key}: {value}")
# 使用items()进行条件筛选
for key, value in student.items():
if isinstance(value, (int, float)) and value > 10:
print(f"大于10的数值: {key}={value}")
items()
方法是最常用的字典遍历方式之一,它返回由(键, 值)对组成的视图对象。
4.按特定顺序遍历
默认情况下,字典遍历会按照键的插入顺序进行(Python 3.7+)。如果需要按照特定顺序遍历,可以结合排序函数:
scores = {'Alice': 85, 'Bob': 92, 'Charlie': 78, 'David': 95}
# 按键字母顺序遍历
for name in sorted(scores):
print(f"{name}: {scores[name]}")
# 按值从高到低遍历
for name, score in sorted(scores.items(), key=lambda x: x[1], reverse=True):
print(f"{name}: {score}")
# 按值从低到高遍历
for name, score in sorted(scores.items(), key=lambda x: x[1]):
print(f"{name}: {score}")
通过结合sorted()
函数和适当的排序键,我们可以按照任意需要的顺序遍历字典。
二、取出所有的key和value
虽然我们已经讨论了如何遍历字典的键和值,但有时我们需要将所有的键或值提取为一个列表或其他集合类型,以便进行进一步的处理。
1.获取所有键的列表
student = {
'name': '张三',
'age': 20,
'major': '计算机科学',
'gpa': 3.8
}
# 获取所有键的列表
keys_list = list(student.keys())
print(keys_list) # 输出: ['name', 'age', 'major', 'gpa']
# 直接转换字典为列表
keys_list_alt = list(student)
print(keys_list_alt) # 输出: ['name', 'age', 'major', 'gpa']
# 获取所有键的集合
keys_set = set(student)
print(keys_set) # 输出: {'name', 'age', 'major', 'gpa'}
2.获取所有值的列表
student = {
'name': '张三',
'age': 20,
'major': '计算机科学',
'gpa': 3.8
}
# 获取所有值的列表
values_list = list(student.values())
print(values_list) # 输出: ['张三', 20, '计算机科学', 3.8]
# 使用列表推导式获取特定类型的值
numeric_values = [v for v in student.values() if isinstance(v, (int, float))]
print(numeric_values) # 输出: [20, 3.8]
# 获取所有值的集合
values_set = set(student.values())
print(values_set) # 输出: {'张三', 20, '计算机科学', 3.8}
3.获取键值对列表
student = {
'name': '张三',
'age': 20,
'major': '计算机科学',
'gpa': 3.8
}
# 获取所有键值对的列表
items_list = list(student.items())
print(items_list) # 输出: [('name', '张三'), ('age', 20), ('major', '计算机科学'), ('gpa', 3.8)]
# 使用列表推导式转换为不同格式
formatted_items = [f"{k}={v}" for k, v in student.items()]
print(formatted_items) # 输出: ['name=张三', 'age=20', 'major=计算机科学', 'gpa=3.8']
4.字典视图对象的特性
keys()
、values()
和items()
方法返回的是视图对象,而不是普通的列表。这些视图对象有一些特殊的特性:
- 动态反映字典变化:视图对象会动态反映字典的变化,无需重新获取。
- 支持迭代:可以直接在for循环中使用。
- 支持成员检测:可以使用
in
运算符检查元素是否存在。 - 支持长度计算:可以使用
len()
函数获取元素数量。
student = {
'name': '张三',
'age': 20,
'major': '计算机科学'
}
# 获取视图对象
keys_view = student.keys()
values_view = student.values()
items_view = student.items()
print(keys_view) # 输出: dict_keys(['name', 'age', 'major'])
# 修改字典
student['gpa'] = 3.8
# 视图对象自动更新
print(keys_view) # 输出: dict_keys(['name', 'age', 'major', 'gpa'])
print('gpa' in keys_view) # 输出: True
print(len(values_view)) # 输出: 4
三、合法的key类型
字典的键必须是不可变类型(immutable),这是因为字典使用哈希表实现,需要通过键的哈希值来定位数据。可变对象的哈希值可能会随着内容的改变而改变,这会导致字典无法正确找到对应的值。
1.常见的合法键类型
- 数字类型:整数(int)、浮点数(float)、复数(complex)
- 字符串(str)
- 元组(tuple),但仅当元组中的所有元素都是不可变类型时
- 布尔值(bool)
- 冻结集合(frozenset)
# 使用不同类型的键创建字典
mixed_keys = {
42: "整数键",
3.14: "浮点数键",
"name": "字符串键",
(1, 2): "元组键",
True: "布尔键",
frozenset([1, 2, 3]): "冻结集合键"
}
for key, value in mixed_keys.items():
print(f"{key} ({type(key).__name__}): {value}")
2.不能作为键的类型
- 列表(list)
- 字典(dict)
- 集合(set)
- 任何其他可变类型
# 尝试使用可变类型作为键
try:
invalid_dict = {[1, 2, 3]: "列表不能作为键"}
except TypeError as e:
print(f"错误: {e}") # 输出: 错误: unhashable type: 'list'
try:
another_invalid = {{1: 'a'}: "字典不能作为键"}
except TypeError as e:
print(f"错误: {e}") # 输出: 错误: unhashable type: 'dict'
3.使用自定义对象作为键
如果要使用自定义类的实例作为字典的键,需要确保该类是"可哈希的",即:
- 实现
__hash__
方法 - 实现
__eq__
方法 - 确保对象是不可变的(或者至少其哈希值依赖的属性是不可变的)
class Person:
def __init__(self, name, birth_year):
self.name = name
self.birth_year = birth_year
# 确保这些属性不会被修改
def __hash__(self):
# 基于不可变属性计算哈希值
return hash((self.name, self.birth_year))
def __eq__(self, other):
if not isinstance(other, Person):
return False
return self.name == other.name and self.birth_year == other.birth_year
def __repr__(self):
return f"Person('{self.name}', {self.birth_year})"
# 使用自定义对象作为键
people_data = {
Person('张三', 2000): {'phone': '123-456-7890', 'email': 'zhang@example.com'},
Person('李四', 1995): {'phone': '098-765-4321', 'email': 'li@example.com'}
}
# 查找特定人的数据
zhang = Person('张三', 2000)
if zhang in people_data:
print(f"{zhang}的联系方式: {people_data[zhang]}")
四、实战案例:计数器(Counter)
Counter
是dict
的另一个子类,专门用于计数:
from collections import Counter
# 计算单词频率
text = "the quick brown fox jumps over the lazy dog"
word_counts = Counter(text.split())
print(word_counts) # 输出: Counter({'the': 2, 'quick': 1, 'brown': 1, ...})
# 找出最常见的单词
print(word_counts.most_common(2)) # 输出: [('the', 2), ('quick', 1)]
# 计数器的数学运算
counter1 = Counter(a=3, b=1)
counter2 = Counter(a=1, b=2)
print(counter1 + counter2) # 输出: Counter({'a': 4, 'b': 3})
print(counter1 - counter2) # 输出: Counter({'a': 2})
五、小结
在本文中,我们深入探讨了Python字典的高级特性和操作技巧。从遍历方法到键类型限制,从视图对象到特殊字典类型,这些知识点共同构成了Python字典的完整图景。
1.字典的核心优势
- 高效的查找:O(1)的平均查找时间复杂度
- 灵活的数据组织:键值对结构适合表示各种关系数据
- 丰富的内置操作:提供了多种方法满足不同需求
- 与Python生态系统的紧密集成:在JSON处理、配置管理等场景中扮演重要角色
2.实际应用场景
字典在实际编程中有着广泛的应用:
- 配置管理:存储程序配置项
- 缓存实现:使用键值对快速查找已计算的结果
- 数据转换:在不同数据格式之间进行映射
- 计数和统计:使用Counter进行频率分析
- 图结构表示:使用键表示节点,值表示边或权重
- 稀疏矩阵:使用(行,列)元组作为键,非零元素作为值
📢 如果你也喜欢这种"不呆头"的技术风格:
👁️ 【关注】 看一个非典型程序员如何用野路子解决正经问题
👍 【点赞】 给"不写八股文"的技术分享一点鼓励
🔖 【收藏】 把这些"奇怪但有用"的代码技巧打包带走
💬 【评论】 来聊聊——你遇到过最"呆头"的 Bug 是啥?
🗳️ 【投票】 您的投票是支持我前行的动力
技术没有标准答案,让我们一起用最有趣的方式,写出最靠谱的代码! 🎮💻
参考链接
关键词标签
#Python #字典 #高级操作 #数据结构 #性能优化