在Python中使用maxheap从列表列表创建字典
我所知道的是,在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(整数除
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]