在Python中返回元组列表中最高的6个名称
请告诉我,我想从下面的元组列表中返回具有最高对应整数的前6个名称(仅名称)。 我已经能够返回所有的名字从最高(短信)到最低(老板)在Python中返回元组列表中最高的6个名称,python,list,tuples,Python,List,Tuples,请告诉我,我想从下面的元组列表中返回具有最高对应整数的前6个名称(仅名称)。 我已经能够返回所有的名字从最高(短信)到最低(老板) 谢谢。如果数据已经排序,只需将前六个元组切掉,然后获得名称: first_six = data[0:6] # or data[:6] only_names = [entry[0] for entry in first_six] 列表可展开为: only_names = [] for entry in first_six: only_names.appen
谢谢。如果数据已经排序,只需将前六个元组切掉,然后获得名称:
first_six = data[0:6] # or data[:6]
only_names = [entry[0] for entry in first_six]
列表可展开为:
only_names = []
for entry in first_six:
only_names.append(entry[0])
如果列表尚未排序,则可以使用排序
方法的键
关键字参数(或内置的排序
按分数排序:
data.sort(key=lambda entry: entry[1], reverse=True)
lambda
是一个匿名函数-等效函数为:
def get_score(entry):
return entry[1]
data.sort(key=get_score, reverse=True)
其中包括:
返回使用sorted
函数排序的数据。由于标准排序顺序是从升序开始的,键
将其设置为降序李>reverse=True
是一个匿名函数,返回参数的第二个元素(在本例中是元组的第二个元素)lambda x:x[1]
是更好的方法,但需要额外的导入李>itemgetter(1)
对列表的前6个元素进行切片李>[0:6]
创建每个传递元组的第一个元素列表李>[x[0]for x in…]
heapq.nlargest
是您在这里想要的:
import heapq
from operator import itemgetter
largest_names = [x[0] for x in heapq.nlargest(6,your_list,key=itemgetter(1))]
它将比排序更有效,因为它只接受最大的元素,而丢弃其余的元素。当然,如果由于其他原因对列表进行了预排序,那么它的效率不如切片
复杂性:
- heapq:O(N)
- 排序:O(NlogN)
- 切片(仅在预排序时):O(6)
heapq.nlargest(6,your_list,key=itemgetter(1))
此行返回(名称、值)元组列表,但只有6个最大的元组——比较由元组中的第二个(index=1-->key=itemgetter(1)
)元素完成
该行的其余部分是对6个最大名称、值元组的列表理解,该元组仅获取元组的名称部分并将其存储在列表中
您可能感兴趣的是,您还可以将此数据存储为
collections.Counter
d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]
仅仅为了进行此计算可能不值得转换(这毕竟是heapq的用途;-),但为了使数据更易于使用,可能值得转换。如果您能解释一下您的代码,那就太好了。初学者可能很难理解发生了什么。
heapq.nlargest(6,your_list,key=itemgetter(1))
d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]