Python3 数据结构(进阶)
这一篇把序列、推导式等技巧串起来,看看如何用内置结构实现栈、队列、堆等经典数据结构,并给出更高效的遍历与解包姿势。
列表当栈
栈是"后进先出"(LIFO),用 append 入栈、pop 出栈即可:
stack = []
stack.append(1) # 入栈
stack.append(2)
stack.append(3)
print(stack.pop()) # 出栈 -> 输出:3
print(stack) # 输出:[1, 2]
列表当队列
队列是"先进先出"(FIFO),从列表头部 pop(0) 很慢,应使用 collections.deque:
from collections import deque
q = deque([1, 2, 3])
q.append(4) # 队尾入队
print(q.popleft()) # 队头出队 -> 输出:1
print(q) # 输出:deque([2, 3, 4])
del 语句
nums = [1, 2, 3, 4]
del nums[0] # 删除下标 0
print(nums) # 输出:[2, 3, 4]
del nums[0:2] # 删除切片
print(nums) # 输出:[4]
x = 10
del x # 删除变量本身
序列解包更多用法
解包不限于元组,用 * 可收集多余元素:
a, b, c = [1, 2, 3] # 列表解包
print(a, b, c) # 输出:1 2 3
first, *rest = [1, 2, 3, 4]
print(first, rest) # 输出:1 [2, 3, 4]
x, y = 1, 2
x, y = y, x # 交换变量
print(x, y) # 输出:2 1
遍历技巧
同时遍历多个序列用 zip;遍历字典可配合 sorted 按键排序:
names = ["小明", "小红"]
scores = [90, 95]
for name, score in zip(names, scores):
print(name, score)
# 输出:
# 小明 90
# 小红 95
d = {"b": 2, "a": 1, "c": 3}
for k in sorted(d): # 按键排序遍历
print(k, d[k], end="; ") # 输出:a 1; b 2; c 3;
推导式综合
列表、集合、字典推导式写法相似,可加条件、可嵌套展开:
nums = range(1, 6)
squares = {x * x for x in nums} # 集合推导式
mapping = {x: x * x for x in nums} # 字典推导式
print(squares) # 输出:{1, 4, 9, 16, 25}(顺序不定)
print(mapping) # 输出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
matrix = [[1, 2], [3, 4]]
flat = [y for row in matrix for y in row] # 展开成一维
print(flat) # 输出:[1, 2, 3, 4]
heapq 堆简介
heapq 提供最小堆:堆顶永远是最小元素,适合取前几个最大/最小值:
import heapq
nums = [5, 2, 8, 1]
heapq.heapify(nums) # 原地建堆
print(heapq.heappop(nums)) # 弹出最小 -> 输出:1
print(heapq.nlargest(2, [3, 1, 2])) # 输出:[3, 2]
print(heapq.nsmallest(2, [3, 1, 2])) # 输出:[1, 2]
小结:栈、队列用列表与 deque 就能实现;del、解包、推导式与 heapq 组成了处理数据的"进阶工具箱",让代码既短又高效。