大家好,今天来为大家解答深入浅出:Python的内置数据结构——堆、栈与队列这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
heapq 堆队列
heapq 是一个内置堆结构,完全二叉树的一种特殊形式,其中父节点的值始终大于子节点。根据其性质,python可以使用一个满足heap[k]=heap[2 * k + 1 ]=heap[2 * k + 2]的列表来实现。 Heapq 是最小堆。如果你想达到最大堆,你可以使用一些技巧。比如heappush时填写数据 * -1,然后heappop时将弹出的元素乘以-1。
导入堆
堆=[]
heapq.heappush(堆, 3)
heapq.heappush(堆, 2)
heapq.heappush(堆, 1)
print(heap) #输出结果为[1, 3, 2]
# 按顺序输出堆的元素
heapq.heappop(heap) # 输出1
heapq.heappop(heap) # 输出2
heapq.heappop(heap) # 输出3
# 如果要输出前n个最大值和前n个最小值,可以使用
heapq.nlargest(n, 堆)
heapq.nsmallest(n, heap)
deque 双端队列
from collections import deque 可以实现栈或者队列功能,因为双端队列可以在队头和尾部进行编辑,所以如果我们要实现栈在python 从功能上来说,最好的选择是deque。当然,我们也可以使用普通的数组结构。
普通的队列操作是在队列尾部插入元素,然后从头部弹出元素:
dq=队列()
dq.append(3) #deque([3])
dq.append(4) #deque([3, 4])
dq.popleft() # Pop 3,dq 是deque([4])。如果设置为栈,FILO,则代码如下
dq=队列()
dq.append(3) #deque([3])
dq.append(4) #deque([3, 4])
dq.pop() # Pop 4,而dq是deque([3])
queue
队列是一个线程安全的包。这个包里有很多结构体,比如栈LifoQueue,如果想在并发环境下使用,最好使用这个结构体,因为如果栈为空,如果弹出栈顶元素,会阻塞会发生直到堆栈不为空。
LifoQueue
LifoQueue 是一个堆栈结构,具有入栈和退出操作。方法分别是put() 和get(),当LifoQueue() 为空时get() 会阻塞。
从队列导入LifoQueue
s=LifoQueue()
s.put(3)
s.put(4)
print(s.get()) # 打印4
print(s.get()) # 打印3
print(s.get()) # 等到s中有元素,则打印并退出
Queue
Queue 是一个有入队和出队操作的队列。方法分别是put()和get(),当Queue为空时get()会阻塞。此外,还可以设置队列的长度。如果不设置队列的长度,或者将队列的长度设置为小于等于0的数字,则表示队列的长度是无限的。可以通过.maxsize属性来获取队列的最大长度
从队列导入队列
q=队列()
q.put(3)
q.put(4)
print(q.get()) # 打印3
print(q.get()) # 打印4
print(q.get()) # 等待q中有元素,然后打印并退出
print(q.get_nowait()) # 如果队列q 为空,则不会等待,而是输出Empty 异常
PriorityQueue
PriorityQueue 是一个优先级队列,并且队列的元素是排序的,因此对于一个已排序的序列可以使用优先级队列,可以高效的获取最大或者最小的元素。
在调度问题的场景中,经常会用到优先级队列,主要包括获取最大值或最小值的操作和入队操作。
优先级队列内部封装了heapq。不同之处在于优先级队列是线程安全的。在并发环境中,应该选择使用PriorityQueue。
从队列导入PriorityQueue
pq=优先队列()
pq.put((2, "姓名"))
pq.put((1, "年龄"))
pq.put((3, "工作"))
而不是pq.empty():
打印(pq.get())
"""
输出内容如下
(1、‘年龄’)
(2、“姓名”)
(3、‘工作’)
OK,关于深入浅出:Python的内置数据结构——堆、栈与队列和的内容到此结束了,希望对大家有所帮助。
【深入浅出:Python的内置数据结构——堆、栈与队列】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
Python自带的数据结构真是太方便了!
有6位网友表示赞同!
我最近要用到堆栈和队列,正好学一学Python里面的实现。
有20位网友表示赞同!
以前用过其他语言实现过的,看看Python怎么说做 ?
有7位网友表示赞同!
python内置的堆、栈和队列真的很好用!
有11位网友表示赞同!
学习一下Python内置的数据结构,能提升我的编码效率!
有19位网友表示赞同!
这让我可以更快速地解决一些算法问题!
有20位网友表示赞同!
之前一直没机会深入了解,正好看看这篇关于Python堆栈和队列的文章。
有11位网友表示赞同!
想了解python实现的堆原理,感觉比手动实现要简单得多。
有7位网友表示赞同!
学习一下Python自带的数据结构,能让我对编程思维更清晰.
有20位网友表示赞同!
堆、栈、队列都是很重要的数据结构,理解它们可以帮助我更加深入地学习Python.
有5位网友表示赞同!
python学习曲线确实比较平缓!
有5位网友表示赞同!
这篇文章应该会把我入门到使用python堆、栈和队列。
有6位网友表示赞同!
感觉用python实现的数据结构比其他语言更直观,更容易理解。
有8位网友表示赞同!
这些数据结构在实际项目中应用非常广泛啊!
有14位网友表示赞同!
学习Python内置的堆、栈和队列,可以让我更好地应对一些常见算法挑战!
有12位网友表示赞同!
Python的数据结构真是设计的太棒了!
有15位网友表示赞同!
这篇文章一定很有用了,我要收藏起来参考!
有11位网友表示赞同!
感觉代码实现起来也比较简单。
有14位网友表示赞同!
在面试中经常会用到堆栈和队列,学习Python的实现方法很有帮助!
有17位网友表示赞同!