在Python中返回元组列表中最高的6个名称

2024-09-28 21:33:26 发布

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

我想从下面的元组列表中返回前6个名称(只返回名称)以及对应的最高整数。 我已经能够返回所有的名字从最高(短信)到最低(老板)。在

[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]

谢谢。在


Tags: 名称列表code整数名字sms短信老板
3条回答
data=[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]
return [x[0] for x in sorted(data, key=lambda x: x[1], reverse=True)[0:6]]

其功能如下:

  • sorted返回使用key函数排序的数据。由于标准排序顺序是从升序开始的,reverse=True将其设置为降序
  • lambda x: x[1]是匿名函数,它返回参数的第二个元素(在本例中是元组的);itemgetter(1)是更好的方法,但需要额外的导入
  • [0:6]将列表的前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))]

它将比排序更有效,因为它只接受最大的元素而丢弃其余的元素。当然,如果由于其他原因对列表进行了预排序,那么它的效率不如切片。在

复杂性:

  • 健康状况:O(N)
  • 排序:O(NlogN)
  • 切片(仅在预排序时):O(6)

说明:

^{pr2}$

这行返回(name,value)元组的列表,但是只有最大的6个元组比较由元组中的第二个(index=1>;key=itemgetter(1))元素完成。在

它只存储一个tuples的最大值的一部分。在


您可能感兴趣的是,您也可以将此数据存储为collections.Counter。在

^{3}$

仅仅为了进行这种计算而进行转换可能不值得(这毕竟是heapq的目的;-),但是为了使数据更易于处理,可能值得进行转换。在

如果数据已经排序,只需将前六个元组切掉,然后获得名称:

first_six = data[0:6]  # or data[:6]
only_names = [entry[0] for entry in first_six]

列表理解可以展开到:

^{pr2}$

如果列表已排序,则可以使用sort方法的key关键字参数(或内置的sorted)按分数排序:

^{3}$

lambda是一个匿名函数-等效函数是:

def get_score(entry):
    return entry[1]

data.sort(key=get_score, reverse=True)

相关问题 更多 >