从零开始学Python(六):数据结构

从零开始学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()方法可以安全地访问。尝试修改元组会报错,因为元组是不可变的。混淆列表和字典的访问方式也会导致错误,列表使用索引,字典使用键。


系列导航