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

时间:2017-04-11 01:16:08

标签: python list lambda

我有一个由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?

5 个答案:

答案 0 :(得分:2)

从降序排序前5个元素。

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

MSeifert的答案在技术上更好于算法。如果有一个大的n列表和相对较少的要素m,那么heapq.largest可能会更快,因为它需要O(n * log m)次,而排序然后切片需要O(n * log n) 1}}。 (有关heapq.largest算法的概述,请参阅here)。然后,日志几乎可以忽略不计,所以一定要测试性能是否是您的关注点!

答案 1 :(得分:1)

使用heapq.nlargest

>>> 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']

答案 2 :(得分:0)

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]]

答案 3 :(得分:0)

使用列表中的sorted函数或.sort方法。两者都采用key=之类的max参数。然后,您可以采用最低或最高批次。

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

答案 4 :(得分:0)

import operator
def printTopX(tags, X):
    print( sorted(tags, reverse=True, key=operator.itemgetter(1))[0:X] )

printTopX(tags, 5)