Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用maxheap从列表列表创建字典_Python_Python 3.x_Algorithm_Max Heap - Fatal编程技术网

在Python中使用maxheap从列表列表创建字典

在Python中使用maxheap从列表列表创建字典,python,python-3.x,algorithm,max-heap,Python,Python 3.x,Algorithm,Max Heap,我所知道的是,在Python中创建maxheap如下: heapq.heappush(heap,value) 我找到了一个著名的面试问题及其解决方案 “给出不同学生、项目的分数列表,其中项目[i]=[IDi,scorei]代表一个具有IDi的学生的一个分数,计算每个学生的前五名平均分。 以成对结果数组的形式返回答案,其中结果[j]=[IDj,topFiveAveragej]表示具有IDj的学生及其前五名平均值。按IDj按递增顺序排序结果。 学生的前五名平均成绩是通过将前五名成绩之和除以5(整数除

我所知道的是,在Python中创建maxheap如下:
heapq.heappush(heap,value)

我找到了一个著名的面试问题及其解决方案

“给出不同学生、项目的分数列表,其中项目[i]=[IDi,scorei]代表一个具有IDi的学生的一个分数,计算每个学生的前五名平均分。 以成对结果数组的形式返回答案,其中结果[j]=[IDj,topFiveAveragej]表示具有IDj的学生及其前五名平均值。按IDj按递增顺序排序结果。 学生的前五名平均成绩是通过将前五名成绩之和除以5(整数除法)计算出来的。”

我看到了一个使用maxheap的解决方案,下面是其中的一部分

# items = [[1,91],[1,92],[2,93],[2,97],[1,60],[2,77],[1,65],[1,87],[1,100],[2,100],[2,76]]

def highFive(self, items):
    seen = defaultdict(list)
    
    for s_id, score in items:
        heapq.heappush(seen[s_id], -score)
    
    # output seen is {1: [-100, -91, -92, -65, -87, -60], 2: [-100, -97, -77, -93, -76]})
    print("seen = ", seen) 
    ...

这段简短的代码对我来说很神秘(我是一名Java开发人员,最近开始学习Python,我的问题不是关于这个解决方案的算法)

我知道如何为给定的整数列表创建maxhep,以及如何分别使用defaultdict创建dictionary,但我不明白这段短代码在没有编写创建dictionary和heap时使用的一些代码的情况下是如何工作的

首先,这段代码甚至没有编写
heapq.heapify(见)
来创建maxheap。 只需创建默认的seen空字典,然后循环输入项并直接
heapq.heappush(seen[s_id],-score)

第二,我在每次迭代中打印出
seen[suid]
。 为什么字典是在
seen[s\u id]
之后创建的,即使没有
append()
方法,比如
seen[s\u id].append(score)

首先,这段代码甚至没有编写heapq.heapify(见)来创建 麦克希普。只需创建默认的空字典,然后循环 输入项目并直接heapq.heappush(参见[s_id],-score)

heapq.heapify(myList)
更改列表中元素的顺序
myList
,使其满足堆的属性。但是,如果
myList
是空列表,则不需要此操作。空列表已满足堆的属性

由于
seen
是一个
defaultdict
,而不仅仅是一个常规的
dict
,因此会自动创建
seen[s_id]
的条目,如果该条目不存在,则会初始化为空列表

其次,我在每次迭代中都打印出seen[suid]。怎么会 即使没有append()方法,字典也是在看到[s_id]后创建的 喜欢看[s_id]。附加(分数)

注意
heapq.heappush(seen[s_id],score)
seen[s_id].append(score)
几乎是等价的。唯一的区别是
append
将元素添加到列表的末尾,而
heapq.heappush
将元素添加到某个位置,以便列表仍然满足堆的属性

如图所示,以下三个代码产生相同的结果:

li=[5,7,9,1,3]
maxheap=[-val表示li中的val]
heapq.heapify(maxheap)
li=[5,7,9,1,3]
maxheap=[]
对于li中的val:
maxsheap.append(-val)
heapq.heapify(maxheap)
li=[5,7,9,1,3]
maxheap=[]
对于li中的val:
heapq.heappush(maxheap,-val)

defaultdict
只是一个
dict
,它允许您为丢失的密钥设置默认值,在您的代码中,您可以看到
seed
被设置为默认值为列表的defaultdict。现在,如果您试图从
seen
访问一个尚不存在的
,您将得到一个空列表。而
heapq.heappush
只是将堆推送到堆(或列表)。这里有几个链接可以帮助你回答你的问题:和。
# items = [[1,91],[1,92],[2,93],[2,97],[1,60],[2,77],[1,65],[1,87],[1,100],[2,100],[2,76]]

def highFive(self, items):
    seen = defaultdict(list)
    
    for s_id, score in items:
        heapq.heappush(seen[s_id], -score)
    
    # output seen is {1: [-100, -91, -92, -65, -87, -60], 2: [-100, -97, -77, -93, -76]})
    print("seen = ", seen) 
    ...

for s_id, score in items:
    id_ = seen[s_id]
    print("\nseen[{0}] = {1}".format(s_id, id_))

    heapq.heappush(id_, -score)         
    ...

output: 
seen[1] = []

seen[1] = [-91]

seen[2] = []

seen[2] = [-93]

seen[1] = [-92, -91]

seen[2] = [-97, -93]

seen[1] = [-92, -91, -60]

seen[1] = [-92, -91, -60, -65]

seen[1] = [-92, -91, -60, -65, -87]

seen[2] = [-97, -93, -77]

seen[2] = [-100, -97, -77, -93]