簡體   English   中英

使用 Python 中的 maxheap 從列表列表創建字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM