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 组成了处理数据的"进阶工具箱",让代码既短又高效。

笔记加载中…