数据结构就是装数据的容器
写程序本质上是处理数据。数据多了,就需要合适的"容器"来装:就像衣柜有抽屉、书架有格子、书包有夹层,Python 也提供了多种数据结构,每种都有自己的脾气。
选对容器,代码又快又清楚;选错容器,代码又慢又绕。这篇文章用生活化的例子,把 Python 里最常用的六种数据结构一次讲明白。
数据结构是算法的地基,容器选对了,问题就解决了一半。
本文核心知识点
- 列表有序、可增删。
- 元组有序、不可变。
- 字典键值对、按名查找。
- 栈/队列两种进出规则。
列表:一条能增删的队列
列表用方括号,是最常用的容器。它像一条排队的人:有顺序,随时可以加人、删人、改人、按位置找人。
scores = [85, 92, 78]
scores.append(95) # 末尾加人
scores.insert(0, 60) # 插到最前面
scores[1] = 88 # 改第二个位置
del scores[0] # 删除第一个
print(scores) # [92, 78, 95]
列表适合:数据有顺序、需要频繁增删改查的场景,比如学生成绩、待办事项。
元组:不可变的安全名单
元组用圆括号,一旦创建就不能修改。它像一份打印好的名单:内容固定,防止程序不小心改掉重要数据。
colors = ("red", "green", "blue")
# colors[0] = "yellow" # 会报错,元组不可变
print(colors[1]) # green
元组适合:常量配置、函数返回多个值时打包,比如坐标点、日期(年、月、日)。
字典:用名字找东西
字典用花括号,存的是"键值对"。它像通讯录:知道名字(键),就能立刻找到电话(值),不用从头翻。
stu = {"name": "小明", "age": 12, "city": "广州"}
print(stu["name"]) # 小明
stu["score"] = 98 # 新增键
print("age" in stu) # True,判断键是否存在
字典适合:需要按键快速查找的场景,比如统计单词出现次数、配置参数、对象属性。
集合:去重与快速判断
集合也是花括号,但只存不重复的元素,而且查找极快。它像一个储物间,放进去的东西自动去掉重复。
words = {"apple", "banana", "apple"}
print(words) # {'apple', 'banana'}
print("pear" in words) # False
集合适合:去重、判断"是否存在"、求交集并集差集,比如检查一个账号是否在黑名单。
栈与队列:两种排队规则
栈(Stack):后进先出,像一摞盘子,后放的先拿。Python 里用列表模拟:append 入栈、pop 出栈。
队列(Queue):先进先出,像排队买票,先来的先办。用 collections 的 deque 实现,效率高。
from collections import deque
stack = []
stack.append(1); stack.append(2)
print(stack.pop()) # 2,后进先出
queue = deque()
queue.append(1); queue.append(2)
print(queue.popleft()) # 1,先进先出
栈常用于:函数调用、括号匹配、撤销操作;队列常用于:任务排队、消息队列、广度优先搜索。
怎么选择合适的数据结构
给青少年的选择口诀:
- 有顺序且要改:用列表。
- 有顺序且固定:用元组。
- 按名字查找:用字典。
- 只要不重复:用集合。
- 后进先出:用栈;先进先出:用队列。
练手建议:用字典统计一段英文里每个单词的出现次数,再用集合找出出现过的所有字母——这两个小练习能把今天学的结构串起来。
本节核心结论
- 选型按"顺序、可变、查找"三个问题判断。
- 栈后进先出(LIFO)。
- 队列先进先出(FIFO)。
- 字典/集合查找快、去重强。