从零开始学Python(六):数据结构
本系列教程将带你从零开始学习Python编程,无需任何编程基础。
列表(List)
列表是Python中最常用的数据结构,用于存储多个有序的元素。创建列表使用方括号,元素之间用逗号分隔。列表可以包含不同类型的元素,比如数字、字符串、布尔值等。
列表索引从0开始,可以使用负数索引从末尾访问元素。列表切片功能强大,可以获取子列表,语法是list[start🔚
step],其中start包含,end不包含,step是步长。
列表是可变的,可以修改元素。使用append()方法在末尾添加元素,insert()方法在指定位置插入元素,remove()方法删除指定值,pop()方法弹出并返回末尾元素。len()函数返回列表长度。
遍历列表可以使用for循环直接遍历元素,也可以使用range(len())遍历索引,或者使用enumerate()同时获取索引和值。sort()方法可以对列表排序,reverse=True表示降序。
列表推导式是创建列表的简洁方法,语法是[表达式 for 变量 in 序列 if 条件],比传统方法更简洁高效。
字典(Dictionary)
字典是键值对的集合,类似于现实中的字典。创建字典使用花括号,每个键值对用冒号分隔,键值对之间用逗号分隔。
访问字典值可以使用方括号加键名,或者使用get()方法。get()方法的好处是可以处理不存在的键,返回默认值而不会报错。
字典是可变的,可以修改值、添加新的键值对。使用del语句删除键值对,pop()方法弹出并返回指定键的值。
遍历字典可以使用keys()方法遍历键,values()方法遍历值,items()方法遍历键值对。使用in关键字检查键是否存在。
元组(Tuple)
元组类似于列表,但创建后不能修改(不可变)。创建元组使用圆括号,元素之间用逗号分隔。单元素元组需要在元素后加逗号,否则会被识别为普通的括号表达式。
访问元组元素和列表一样,可以使用索引和切片。元组解包功能很方便,可以将元组的元素赋值给多个变量。
集合(Set)
集合是无序且不重复的元素集合。创建集合使用花括号,或者使用set()函数。集合会自动去除重复元素。
集合支持并集、交集、差集等运算,分别使用|、&、-运算符。add()方法添加元素,remove()方法删除元素。
数据结构选择指南
列表是有序、可重复、可变的序列,适合存储序列数据,需要频繁修改的场景。字典是键值对集合,快速查找,适合存储结构化数据,需要通过键访问的场景。元组是有序、不可变的序列,适合存储不变的数据,如坐标、颜色。集合是无序、不重复的元素集合,适合去重、集合运算。
实战示例:待办事项管理器
让我们创建一个实用的待办事项管理程序,可以添加、查看、完成和删除待办事项。
创建文件 todo_list.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
def display_menu(): """显示菜单""" print("\n" + "=" * 40) print(" 待办事项管理器") print("=" * 40) print("1. 查看所有待办事项") print("2. 添加待办事项") print("3. 完成待办事项") print("4. 删除待办事项") print("0. 退出") print("=" * 40)
def view_todos(todos): """查看所有待办事项""" if not todos: print("\n还没有待办事项!") return
print("\n你的待办事项:") print("-" * 40) for i, todo in enumerate(todos, 1): status = "✓" if todo["completed"] else " " print(f"{i}. [{status}] {todo['task']}") print("-" * 40)
def add_todo(todos): """添加待办事项""" task = input("\n请输入待办事项:") if task.strip(): todos.append({"task": task, "completed": False}) print(f"已添加:{task}") else: print("待办事项不能为空!")
def complete_todo(todos): """完成待办事项""" if not todos: print("\n还没有待办事项!") return
view_todos(todos) try: index = int(input("\n请输入要完成的待办事项编号:")) - 1 if 0 <= index < len(todos): todos[index]["completed"] = True print(f"已完成:{todos[index]['task']}") else: print("无效的编号!") except ValueError: print("请输入有效的数字!")
def delete_todo(todos): """删除待办事项""" if not todos: print("\n还没有待办事项!") return
view_todos(todos) try: index = int(input("\n请输入要删除的待办事项编号:")) - 1 if 0 <= index < len(todos): deleted = todos.pop(index) print(f"已删除:{deleted['task']}") else: print("无效的编号!") except ValueError: print("请输入有效的数字!")
def main(): """主程序""" todos = []
while True: display_menu() choice = input("\n请选择操作(0-4):")
if choice == "0": print("\n感谢使用,再见!") break elif choice == "1": view_todos(todos) elif choice == "2": add_todo(todos) elif choice == "3": complete_todo(todos) elif choice == "4": delete_todo(todos) else: print("无效选择,请重试")
if __name__ == "__main__": main()
|
这个程序使用列表存储待办事项,每个事项是一个字典,包含task和completed属性。使用enumerate()遍历列表时同时获取索引和值,使用字典的键来访问和修改待办事项的属性。
常见错误
列表索引越界是最常见的错误,应该先检查索引是否在有效范围内。字典键不存在也会报错,使用get()方法可以安全地访问。尝试修改元组会报错,因为元组是不可变的。混淆列表和字典的访问方式也会导致错误,列表使用索引,字典使用键。
系列导航: