[英]Create dictionary from a list of lists by using maxheap in Python
我所知道的是在 Python 中創建一個 maxheap 如下: heapq.heappush(heap, value)
的語法
li = [5, 7, 9, 1, 3]
maxheap = [-val for val in li]
heapq.heapify(maxheap)
heapq.heappush(maxheap, -10)
print('maxheap = ', maxheap) # [-10, -7, -9, -1, -3, -5]
我發現了一個著名的面試問題及其解決方案之一。
“給定一個不同學生、項目的分數列表,其中 items[i] = [IDi, scorei] 表示來自具有 IDi 的學生的一個分數,計算每個學生的前五名平均值。將答案作為一對結果數組返回,其中 result[j] = [IDj, topFiveAveragej] 表示 IDj 的學生及其前五名的平均成績。按 IDj 升序排列結果。學生的前五名平均成績的計算方法是將他們的前五名成績之和除以5 使用 integer 划分。
我看到了一個使用 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,我的問題不是關於這個解決方案的算法)。
我知道如何為給定的 integer 列表創建一個 maxhep 以及如何分別使用 defaultdict 創建字典,但不明白這個短代碼是如何完全完成的,甚至沒有編寫一些在創建字典和堆時使用的代碼?
首先,這段代碼甚至沒有寫heapq.heapify(seen)
來創建 maxheap。 只需創建默認的空字典 seen,然后循環輸入項並直接heapq.heappush(seen[s_id], -score)
其次,我在每次迭代中打印出seen[s_id]
。 即使沒有像seen[s_id].append(score)
這樣的append()
方法,為什么在seen[s_id]
之后創建字典?
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]
首先,這段代碼甚至沒有寫 heapq.heapify(seen) 來創建 maxheap。 只需創建默認的空字典 seen,然后循環輸入項並直接 heapq.heappush(seen[s_id], -score)
heapq.heapify(myList)
更改列表myList
中元素的順序,使其滿足堆的屬性。 但是,如果myList
是一個空列表,則不需要此操作。 空列表已經滿足堆的屬性。
由於seen
是一個defaultdict
而不僅僅是一個常規dict
,如果該條目不存在,則自動創建一個seen[s_id]
的條目,並初始化為一個空列表。
其次,我在每次迭代中打印出 seen[s_id]。 即使沒有像 seen[s_id].append(score) 這樣的 append() 方法,為什么會在 seen[s_id] 之后創建字典?
注意heapq.heappush(seen[s_id], score)
和seen[s_id].append(score)
幾乎是等價的。 唯一的區別是append
在列表末尾添加元素,而heapq.heappush
在某些 position 中添加元素,因此列表仍然滿足堆的屬性。
作為說明,以下三個代碼產生相同的結果:
li = [5, 7, 9, 1, 3]
maxheap = [-val for val in li]
heapq.heapify(maxheap)
li = [5, 7, 9, 1, 3]
maxheap = []
for val in li:
maxheap.append(-val)
heapq.heapify(maxheap)
li = [5, 7, 9, 1, 3]
maxheap = []
for val in li:
heapq.heappush(maxheap, -val)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.