我有一个由tags
和weights
对列表组成的数据结构,如下所示:
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?
答案 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)
>>> 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)