Python在加权项列表中获得N个最大值

2024-06-17 13:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由tagsweights对组成的数据结构,如下所示:

tags = [['male vocalists', 4], ['Lo-Fi', 2], ['pop underground', 2], ['pop', 16], ['power pop', 99], ['post rock', 2], ['alternative', 59], ['electronic', 2], ['classic rock', 2], ['alternative rock', 14], ['pop rock', 2], ['baroque pop', 2], ['powerpop', 4], ['melodic', 2], ['seen live', 62], ['Bellshill', 3], ['singer-songwriter', 2], ['Favourites', 2], ['Teenage Fanclub', 4], ['emo', 2], ['glasgow', 12], ['Scottish', 73], ['indie pop', 27], ['indie', 100], ['00s', 3], ['new wave', 3], ['rap', 2], ['ambient', 2], ['brit pop', 2], ['90s', 14], ['britpop', 26], ['indie rock', 68], ['electronica', 2], ['shoegaze', 5], ['scotland', 11], ['post-punk', 3], ['Alt-country', 2], ['80s', 3], ['jangle pop', 7], ['guitar pop', 4], ['Pop-Rock', 2], ['rock', 31], ['favorites', 2], ['creation records', 3], ['All', 2], ['punk', 3], ['scottish pop', 2], ['british', 17], ['scottish indie', 2], ['slowcore', 2], ['UK', 6], ['jangly', 2]]

我知道我可以通过以下方式获得具有最高值的标签:

top = max(tags, key=lambda x:x[1])[0]

正确地产生indie。你知道吗

但是如何得到N的最大值,比如说,5?你知道吗


Tags: 数据结构lotagspostpopmalefirock
3条回答

heapq让你做一些非常酷的事情,比如:

In [168]: heapq.nlargest(5, tags, key=operator.itemgetter(1))
Out[168]: 
[['indie', 100],
 ['power pop', 99],
 ['Scottish', 73],
 ['indie rock', 68],
 ['seen live', 62]]

使用^{}

>>> import heapq

>>> heapq.nlargest(5, tags, key=lambda x:x[1])
[['indie', 100],
 ['power pop', 99],
 ['Scottish', 73],
 ['indie rock', 68],
 ['seen live', 62]]

或者如果你只对名字感兴趣:

>>> [name for name, _ in heapq.nlargest(5, tags, key=lambda x:x[1])]
['indie', 'power pop', 'Scottish', 'indie rock', 'seen live']

从降序排序中切分前5个元素。你知道吗

sorted(tags, key=lambda x:x[1], reverse=True)[:5]

MSeifert的答案在算法上技术上更好。如果有一个大的长度列表n和相对较少的元素数来获取m,那么heapq.largest可能会更快,因为它需要O(n * log m)时间,而排序然后切片则需要O(n * log n)。(有关heapq.largest算法的大致轮廓,请参见here)。再说一遍,日志几乎可以忽略不计,所以一定要测试性能是否是您关心的问题!你知道吗

相关问题 更多 >