第三章:Python 数据结构
在 Python 中,数据结构是组织和存储数据的重要方式。掌握好数据结构不仅能帮助我们编写出高效、优雅的代码,同时也为后续解决实际问题打下坚实的基础。本章主要介绍 Python 中最常用的数据结构,包括列表、元组、字典、集合以及字符串,并通过两个实战案例来帮助大家巩固所学知识。
3.1 列表:创建、访问、操作、常用方法
列表是 Python 中最常用的数据结构之一,它是一个有序的、可变的元素集合。我们可以用列表来存储多个数据项,并通过下标来访问其中的元素。
列表的创建和访问
使用方括号 []
可以快速创建一个列表:
# 创建一个包含多个元素的列表 fruits = ["苹果", "香蕉", "橙子", "葡萄"] print("原始列表:", fruits) # 访问列表中的元素(索引从 0 开始) print("第一个水果:", fruits[0]) print("最后一个水果:", fruits[-1])
在上面的示例中,我们创建了一个水果列表,并通过索引访问了第一个和最后一个元素。负索引 -1
表示从列表末尾开始计数。
列表的常用操作
修改元素:由于列表是可变的,我们可以直接修改某个位置的值。
fruits[1] = "菠萝" print("修改后的列表:", fruits)
添加元素:常用的方法有
append()
、insert()
和extend()
。# 在列表末尾添加新元素 fruits.append("西瓜") print("添加新元素后:", fruits) # 在指定位置插入元素 fruits.insert(2, "草莓") print("插入元素后:", fruits) # 扩展列表:将另一个列表的所有元素添加到当前列表中 more_fruits = ["柠檬", "桃子"] fruits.extend(more_fruits) print("扩展后的列表:", fruits)
删除元素:可以使用
remove()
、pop()
和del
。# 删除指定元素(只删除第一次出现的) fruits.remove("菠萝") print("删除菠萝后:", fruits) # 删除指定位置的元素,并返回该元素 removed_item = fruits.pop(3) print("删除索引 3 的元素:", removed_item) print("删除后的列表:", fruits) # 使用 del 语句删除指定位置的元素 del fruits[0] print("使用 del 删除后的列表:", fruits)
排序与反转:列表内的元素可以进行排序和反转操作。
numbers = [5, 3, 8, 1, 9] # 排序(默认升序) numbers.sort() print("排序后的列表:", numbers) # 倒序排序 numbers.sort(reverse=True) print("倒序排序后的列表:", numbers) # 反转列表元素(不排序,只改变顺序) numbers.reverse() print("反转后的列表:", numbers)
切片操作:通过切片可以获取列表中的一部分数据。
# 获取列表的前3个元素 sub_list = numbers[:3] print("前3个元素:", sub_list) # 获取列表的最后2个元素 last_two = numbers[-2:] print("最后2个元素:", last_two)
列表的灵活性和丰富的方法使其在日常编程中无处不在。掌握了列表之后,我们可以轻松应对各种需要有序数据存储和操作的场景。
3.2 元组:创建、访问、与列表的区别
元组与列表类似,也是一个有序的数据集合,但元组是不可变的。一旦创建后,元组中的数据就不能修改,这一特性使得元组在数据安全性和作为字典键等场景中非常有用。
元组的创建和访问
元组可以使用小括号 ()
创建:
# 创建一个元组 dimensions = (1920, 1080) print("屏幕分辨率:", dimensions) # 访问元组元素(索引和列表相同) print("宽度:", dimensions[0]) print("高度:", dimensions[1])
元组与列表的区别
可变性:列表是可变的,可以动态添加、删除或修改元素;元组是不可变的,一旦创建就不能更改。
# 尝试修改元组中的元素会报错 # dimensions[0] = 1280 # 这行代码会抛出 TypeError
用途:由于元组不可变,它通常用于存储不希望改变的数据,如数据库记录、坐标等。同时,元组可以作为字典的键,而列表不能。
性能:元组的操作速度通常比列表快,因为它们是不可变的,在某些场景下可以提高性能。
元组的不可变特性在确保数据完整性方面起到关键作用,并且也能在程序设计中表达出“数据常量”的意义。
3.3 字典:创建、访问、操作、常用方法
字典是一种无序的键值对集合,它使用键(key)来存储和访问数据。字典的键必须是不可变的数据类型(如字符串、数字、元组等)。
字典的创建和访问
# 创建一个字典 student = { "姓名": "张三", "年龄": 20, "专业": "计算机科学" } print("学生信息:", student) # 通过键访问对应的值 print("学生姓名:", student["姓名"]) # 使用 get() 方法访问,如果键不存在则返回 None 或指定的默认值 print("学生性别:", student.get("性别", "未知"))
字典的常用操作
添加或修改键值对:
# 添加新的键值对 student["性别"] = "男" print("更新后的学生信息:", student) # 修改已有的键值对 student["年龄"] = 21 print("修改年龄后的学生信息:", student)
删除键值对:
# 使用 del 删除指定键 del student["专业"] print("删除专业后的学生信息:", student) # 使用 pop() 删除并返回指定键的值 age = student.pop("年龄") print("删除并获取年龄:", age) print("最终学生信息:", student)
遍历字典:
# 遍历键值对 for key, value in student.items(): print(f"{key}: {value}") # 只遍历键 for key in student.keys(): print("键:", key) # 只遍历值 for value in student.values(): print("值:", value)
字典合并与拷贝:
# 合并两个字典 extra_info = {"城市": "北京", "爱好": "编程"} student.update(extra_info) print("合并后的字典:", student) # 深拷贝字典 import copy student_copy = copy.deepcopy(student)
字典作为一种映射数据结构,具有快速查找和灵活存储的优点,非常适合用于存储结构化数据。
3.4 集合:创建、操作、集合运算
集合是一个无序、不重复元素的集合。集合可以用来进行数学上的集合运算,比如并集、交集、差集等。
集合的创建和基本操作
# 创建集合 numbers_set = {1, 2, 3, 4, 5} print("初始集合:", numbers_set) # 添加元素 numbers_set.add(6) print("添加元素后的集合:", numbers_set) # 删除元素 numbers_set.remove(3) # 如果元素不存在会抛出 KeyError print("删除元素后的集合:", numbers_set) # 使用 discard 删除元素,不存在时不会抛出错误 numbers_set.discard(10)
集合的常见运算
假设有两个集合,我们可以进行如下操作:
set_a = {1, 2, 3, 4} set_b = {3, 4, 5, 6} # 并集:两个集合所有元素的集合 union_set = set_a.union(set_b) print("并集:", union_set) # 交集:两个集合共同的元素 intersection_set = set_a.intersection(set_b) print("交集:", intersection_set) # 差集:在 set_a 中有但在 set_b 中没有的元素 difference_set = set_a.difference(set_b) print("差集(set_a - set_b):", difference_set) # 对称差集:两个集合中不重复的元素 symmetric_difference_set = set_a.symmetric_difference(set_b) print("对称差集:", symmetric_difference_set)
集合不仅用于去重,还能帮助我们快速进行集合关系的判断和操作,是数学和数据处理中的常用工具。
3.5 字符串:创建、操作、常用方法
字符串是 Python 中最常用的数据类型之一。它本质上是字符的序列,支持多种操作,包括切片、拼接、查找、替换等。
字符串的创建和访问
# 使用单引号或双引号创建字符串 greeting = "Hello, Python!" print("问候语:", greeting) # 使用三引号创建多行字符串 multi_line = """这是一个 多行字符串示例, 用于展示 Python 的字符串功能。""" print(multi_line) # 访问字符串中的单个字符 print("第一个字符:", greeting[0]) print("最后一个字符:", greeting[-1])
字符串的常用操作和方法
拼接字符串:
name = "Alice" welcome_msg = "Hello, " + name + "!" print(welcome_msg)
切片和索引:
# 获取子字符串 sub_str = greeting[7:13] print("子字符串:", sub_str)
常用方法:
# 转换大小写 print("大写:", greeting.upper()) print("小写:", greeting.lower()) # 查找子串位置 index = greeting.find("Python") print("子串 'Python' 的起始位置:", index) # 替换子串 new_greeting = greeting.replace("Python", "世界") print("替换后的字符串:", new_greeting) # 分割字符串 words = greeting.split(", ") print("分割后的列表:", words) # 去除两端空白字符 spaced = " hello " print("去除空白后的字符串:", spaced.strip())
字符串提供了非常丰富的方法来处理文本数据,熟悉这些方法能够大大提高文本数据处理的效率。
3.6 实战练习
在本小节中,我们将通过两个实战练习来应用前面学到的数据结构知识,分别是学生成绩管理系统和词频统计。
练习 1:学生成绩管理系统
在这个案例中,我们使用字典和列表来实现一个简单的学生成绩管理系统。系统支持添加、删除、修改和查询学生成绩。以下是示例代码:
# 学生成绩管理系统示例 def print_menu(): print("\n欢迎使用学生成绩管理系统") print("1. 添加学生成绩") print("2. 修改学生成绩") print("3. 删除学生成绩") print("4. 查询所有学生成绩") print("5. 退出系统") def add_student(students): name = input("请输入学生姓名:") if name in students: print("该学生已存在,不能重复添加。") else: try: score = float(input("请输入学生成绩:")) students[name] = score print(f"添加 {name} 的成绩成功!") except ValueError: print("成绩输入有误,请输入数字。") def modify_student(students): name = input("请输入要修改成绩的学生姓名:") if name in students: try: score = float(input("请输入新的成绩:")) students[name] = score print(f"{name} 的成绩修改成功!") except ValueError: print("成绩输入有误,请输入数字。") else: print("该学生不存在!") def delete_student(students): name = input("请输入要删除成绩的学生姓名:") if name in students: del students[name] print(f"{name} 的记录已删除。") else: print("该学生不存在!") def query_students(students): if not students: print("当前无学生记录。") else: print("所有学生成绩:") for name, score in students.items(): print(f"{name}: {score}") def main(): students = {} # 用字典存储学生成绩,键为姓名,值为成绩 while True: print_menu() choice = input("请输入您的选择:") if choice == '1': add_student(students) elif choice == '2': modify_student(students) elif choice == '3': delete_student(students) elif choice == '4': query_students(students) elif choice == '5': print("退出系统,再见!") break else: print("无效的选择,请重新输入。") if __name__ == "__main__": main()
在这段代码中,我们:
使用了字典来存储学生的姓名和成绩;
定义了多个函数分别处理添加、修改、删除和查询的功能;
通过一个无限循环和菜单提示来实现命令行交互。
练习 2:词频统计
词频统计是文本处理中的常见任务,我们将通过以下示例代码来实现对一段文本中各单词出现次数的统计。
def word_frequency(text): # 将文本转换为小写,并替换标点符号 text = text.lower() for ch in [",", ".", "!", "?", ";", ":", "\n"]: text = text.replace(ch, " ") # 使用 split() 方法分割单词 words = text.split() freq = {} for word in words: freq[word] = freq.get(word, 0) + 1 return freq if __name__ == "__main__": sample_text = """ Python 是一种广泛使用的高级编程语言,由 Guido van Rossum 创建。Python 语言设计强调代码的可读性, 允许程序员用更少的代码表达想法。Python 支持多种编程范式,包括面向对象、过程化编程以及函数式编程。 """ frequency = word_frequency(sample_text) print("词频统计结果:") for word, count in frequency.items(): print(f"{word}: {count}")
在此代码中,我们:
将输入文本统一转换为小写,方便统计(避免大小写差异带来的统计误差);
用
replace()
去除常见标点,并用空格替换;用
split()
方法将文本分割成单词列表;遍历单词列表,利用字典统计每个单词出现的次数,并最终打印结果。
总结
本章详细介绍了 Python 中常用的数据结构及其基本操作:
列表:有序、可变的数据集合,适用于存储和操作一系列数据;
元组:不可变的有序数据集合,常用于存储不希望修改的数据;
字典:以键值对形式存储数据的映射结构,支持高效的查找和修改操作;
集合:无序且不重复的数据集合,支持数学集合的各类运算;
字符串:文本数据的表示,提供了丰富的操作方法。
通过对这几种数据结构的学习,我们不仅掌握了它们的基本用法,还能根据不同的需求选择合适的数据结构来解决实际问题。最后,通过两个实战练习——学生成绩管理系统和词频统计,我们把理论知识应用到了实际场景中,从而巩固了对数据结构的理解和使用能力。
希望通过本章的学习,大家能对 Python 中的数据结构有一个全面的认识,为后续编程实践打下坚实的基础。如果你有任何问题或建议,欢迎在评论区交流讨论。继续加油,迈向 Python 编程的更高层次!
这篇博客文章涵盖了基础知识、详细代码示例以及实践应用,内容深入且结构清晰,适合零基础及进阶学员系统学习 Python 数据结构的相关知识。