想澄清 heapq.nlargest 参数 'key'

Would like clarification on the heapq.nlargest parameter 'key'

下面的函数returns 数组中的前 k 个元素。它为数组中的每个唯一元素分配一个频率,并将数据添加到 numbers 字典。

个数:

{1: 3, 2: 2, 3: 1}

我对 heapq.nlargest(k, numbers.keys(), key=numbers.get) 部分感到困惑;可迭代参数 numbers.keys() 和关键参数 numbers.get 究竟是如何被利用的?

我明白 heapq.nlargest()numbers.keys() 转换为最大堆结构,但我很困惑为什么具体是 numbers.keys() 而不仅仅是 numbers?

最后,为什么使用的是关键参数numbers.get


def topKFrequent(self, nums, k):
    numbers = {}
    for n in nums:
        if n in numbers: numbers[n] += 1
        else: numbers[n] = 1        
    return heapq.nlargest(k, numbers.keys(), key=numbers.get) 

我正在尝试理解这一点:

heapq.nlargest(n, iterable[, key])

Return a list with the n largest elements from the dataset defined by iterable. key, if provided, specifies a function of one argument that is used to extract a comparison key from each element in the iterable: key=str.lower Equivalent to: sorted(iterable, key=key, reverse=True)[:n]

我们来分解一下:

heapq.nlargest(k, numbers.keys(), key=numbers.get)

此代码将遍历 numbers.keys(),因此遍历字典的键 numbers。它们将根据键函数 numbers.get 进行排序,其中 returns 与每个键关联的值。

这意味着您将从 numbers 中获取对应于 k 个最大值的键。

正如@ShadowRanger 在他们的评论中指出的那样,您还可以使用:

heapq.nlargest(k, numbers, key=numbers.get)

因为迭代字典实际上是迭代它的键。