Python内置库中的数据结构
Python标准库提供了多种数据结构,非常适合用于算法实现。以下是常用的几种:
1. 栈 (Stack)
Python中可以使用列表(list)作为栈:
1 2 3 4 5
| stack = [] stack.append(1) stack.append(2) top = stack[-1] popped = stack.pop()
|
2. 队列 (Queue)/双端队列
普通队列 (FIFO)
1 2 3 4 5 6 7
| from collections import deque
queue = deque() queue.append(1) queue.append(2) first = queue[0] dequeued = queue.popleft()
|
3. 堆 (Heap)/优先队列 (Priority Queue)
Python的heapq
模块提供了堆队列算法实现(最小堆):
1 2 3 4 5 6 7
| import heapq
nums = [3, 1, 4, 1, 5, 9, 2, 6] heapq.heapify(nums) heapq.heappush(nums, 0) smallest = heapq.heappop(nums) n_largest = heapq.nlargest(3, nums)
|
4. 哈希表/字典 (Dictionary) 和 OrderedDict,set,orderedset借助OrderedDict
普通字典
1 2 3 4
| d = {'a': 1, 'b': 2} d['c'] = 3 keys = d.keys() values = d.values()
|
有序字典
1 2 3 4 5 6
| from collections import OrderedDict
od = OrderedDict() od['a'] = 1 od['b'] = 2
|
5.线程安全的结构:栈、队列、堆
在 Python 中,queue
模块提供了多种线程安全的队列实现,适用于多线程编程场景。以下是 queue
模块中主要数据结构的用法和区别:
1. queue.Queue
(先进先出队列,FIFO)
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
| import queue
q = queue.Queue(maxsize=3)
q.put(1) q.put(2) q.put(3)
print(q.get()) print(q.get())
print(q.qsize()) print(q.empty()) print(q.full())
|
2. queue.LifoQueue
(后进先出队列,LIFO,类似栈)
1 2 3 4 5 6 7 8 9
| import queue
stack = queue.LifoQueue() stack.put(1) stack.put(2) stack.put(3)
print(stack.get()) print(stack.get())
|
3. queue.PriorityQueue
(优先队列,基于堆)
1 2 3 4 5 6 7 8 9 10 11
| import queue
pq = queue.PriorityQueue()
pq.put((3, "Low priority")) pq.put((1, "High priority")) pq.put((2, "Medium priority"))
print(pq.get()) print(pq.get())
|
关键区别
队列类型 |
顺序规则 |
线程安全 |
大小限制 |
特殊方法 |
Queue |
FIFO(先进先出) |
✅ |
可选 |
task_done() , join() |
LifoQueue |
LIFO(后进先出) |
✅ |
可选 |
同 Queue |
PriorityQueue |
按优先级排序 |
✅ |
可选 |
同 Queue |
常见用途
- 多线程任务调度:主线程向队列提交任务,工作线程消费。
- 生产者-消费者模型:协调不同线程的数据交换。
- 广度优先搜索(BFS):使用
Queue
实现。
- 深度优先搜索(DFS):使用
LifoQueue
模拟栈。
注意事项
- 线程安全:所有操作(
put()
/get()
)自带锁,适合多线程。
- 性能:
Queue
> PriorityQueue
。
- 单线程场景:直接使用
collections.deque
(更快但非线程安全)。