首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回Python元组列表中最高的6个名称

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

Stack Overflow用户
提问于 2012-10-09 13:41:58
回答 3查看 818关注 0票数 7

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

代码语言:javascript
复制
[('sms', 10), ('bush', 9), ('michaels', 7), ('operations', 6), ('research', 5), ('code', 4), ('short', 3), ('ukandu', 2), ('technical', 1), ('apeh', 1), ('boss', 1)]

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-10-09 13:45:25

heapq.nlargest就是你在这里想要的:

代码语言:javascript
复制
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)

解释:

代码语言:javascript
复制
heapq.nlargest(6,your_list,key=itemgetter(1)) 

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

行的其余部分是一个列表-对6个最大名称的理解,值元组,它只取元组的名称部分并将其存储在一个列表中。

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

代码语言:javascript
复制
d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]

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

票数 11
EN

Stack Overflow用户

发布于 2012-10-09 13:44:53

代码语言:javascript
复制
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 ... ]创建每个传递的元组的第一个元素的列表;
票数 4
EN

Stack Overflow用户

发布于 2012-10-09 13:43:48

如果数据已经被排序,只需将前六个元组分割,然后获取名称:

代码语言:javascript
复制
first_six = data[0:6]  # or data[:6]
only_names = [entry[0] for entry in first_six]

列表理解可以展开为:

代码语言:javascript
复制
only_names = []
for entry in first_six:
    only_names.append(entry[0])

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

代码语言:javascript
复制
data.sort(key=lambda entry: entry[1], reverse=True)

lambda是一个匿名函数--等价于:

代码语言:javascript
复制
def get_score(entry):
    return entry[1]

data.sort(key=get_score, reverse=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12801444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档