鱼C论坛

 找回密码
 立即注册
查看: 1843|回复: 6

[已解决]python 代码疑惑

[复制链接]
发表于 2020-9-14 09:42:00 | 显示全部楼层 |阅读模式
2鱼币
import heapq

class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]
问题1:代码最后的[-1]是干什么的,我把-1改成2,结果好像没变化
问题2:我上传的图中的q._queue的排序好像没什么规律,我看python关于heapq官方文档,应该从小到大排列吧?
最佳答案
2020-9-14 09:42:01
本帖最后由 fall_bernana 于 2020-9-14 17:30 编辑
李万金 发表于 2020-9-14 15:56
问题1能否深入讲讲,改-1为2为什么结果没变
问题二的二叉树排列是完美二叉树吗


题1能否深入讲讲,改-1为2为什么结果没变
heapq里你存放的是一个一个的tuple。比如(-5,1,Item('bar')).你每次heappop出来一个。然后你用下标取-1是最后一个,2在这里也是最后一个值。

问题二的二叉树排列是完美二叉树吗
不是。他只是保证根节点总是最小的。

h=[0, 1, 3, 5, 1, 6, 7, 10, 9, 4, 2]
                 0
        1                 3
    5        1        6        7   
10  9   4   2  
------------------------------------
2020.png

最佳答案

查看完整内容

题1能否深入讲讲,改-1为2为什么结果没变 heapq里你存放的是一个一个的tuple。比如(-5,1,Item('bar')).你每次heappop出来一个。然后你用下标取-1是最后一个,2在这里也是最后一个值。 问题二的二叉树排列是完美二叉树吗 不是。他只是保证根节点总是最小的。 h=[0, 1, 3, 5, 1, 6, 7, 10, 9, 4, 2] 0 1 3 5 1 6 7 10 9 4 2 ------ ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-14 09:42:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 fall_bernana 于 2020-9-14 17:30 编辑
李万金 发表于 2020-9-14 15:56
问题1能否深入讲讲,改-1为2为什么结果没变
问题二的二叉树排列是完美二叉树吗


题1能否深入讲讲,改-1为2为什么结果没变
heapq里你存放的是一个一个的tuple。比如(-5,1,Item('bar')).你每次heappop出来一个。然后你用下标取-1是最后一个,2在这里也是最后一个值。

问题二的二叉树排列是完美二叉树吗
不是。他只是保证根节点总是最小的。

h=[0, 1, 3, 5, 1, 6, 7, 10, 9, 4, 2]
                 0
        1                 3
    5        1        6        7   
10  9   4   2  
------------------------------------
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-14 10:01:33 | 显示全部楼层
本帖最后由 LuLD 于 2020-9-14 10:24 编辑

数组 列表 的 下标

>>> a = [1,2,3,4,5]
>>> a[-1]
5
>>> a[2]
3


return heapq.heappop(self._queue)[-1]

heapq.heappop(self._queue) 看成一个 数组名( 呃 列表 )

[-1] 是取 一个数组 (列表)的最后一个值

return heapq.heappop(self._queue)[-1]   返回 heapq.heappop(self._queue) 数组(列表)的最后一个值



不会排列数组,只是显示 数组的下标的

以上为个人理解,仅供参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-14 10:17:23 From FishC Mobile | 显示全部楼层
楼上正解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-14 10:20:10 | 显示全部楼层
问题1:代码最后的[-1]是干什么的,我把-1改成2,结果好像没变化
heapq.heappop(self._queue)指的是(-priority, self._index, item) ,-1和2都是 item的值

问题2:我上传的图中的q._queue的排序好像没什么规律,我看python关于heapq官方文档,应该从小到大排列吧?
q._queue是个二叉树排列,不是按按大小顺序排列
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-14 10:43:56 | 显示全部楼层
q._queue并不是从小到大排序,只是保证每次heappop()出的都是最小的元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-14 15:56:38 | 显示全部楼层
fall_bernana 发表于 2020-9-14 10:20
问题1:代码最后的[-1]是干什么的,我把-1改成2,结果好像没变化
heapq.heappop(self._queue)指的是(-prio ...

问题1能否深入讲讲,改-1为2为什么结果没变
问题二的二叉树排列是完美二叉树吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表