Python内置库中的数据结构
Python标准库提供了多种数据结构,非常适合用于算法实现。以下是常用的几种:
1. 栈 (Stack)
Python中可以使用列表(list)作为栈:
| 12
 3
 4
 5
 
 | stack = []stack.append(1)
 stack.append(2)
 top = stack[-1]
 popped = stack.pop()
 
 | 
2. 队列 (Queue)/双端队列
普通队列 (FIFO)
| 12
 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模块提供了堆队列算法实现(最小堆):
| 12
 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
普通字典
| 12
 3
 4
 
 | d = {'a': 1, 'b': 2}d['c'] = 3
 keys = d.keys()
 values = d.values()
 
 | 
有序字典
| 12
 3
 4
 5
 6
 
 | from collections import OrderedDict
 od = OrderedDict()
 od['a'] = 1
 od['b'] = 2
 
 
 | 
5.线程安全的结构:栈、队列、堆
在 Python 中,queue 模块提供了多种线程安全的队列实现,适用于多线程编程场景。以下是 queue 模块中主要数据结构的用法和区别:
1. queue.Queue(先进先出队列,FIFO)
| 12
 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,类似栈)
| 12
 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(优先队列,基于堆)
| 12
 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(更快但非线程安全)。