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

时间:2012-10-09 13:41:59

标签: python list tuples

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

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

谢谢。

3 个答案:

答案 0 :(得分:11)

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))元素完成。 / p>

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


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

d = collections.Counter(dict(your_list))
biggest = [x[0] for x in d.most_common(6)]

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

答案 1 :(得分:4)

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 ... ]创建每个传递元组的第一个元素列表;

答案 2 :(得分:1)

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

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

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

data.sort(key=lambda entry: entry[1], reverse=True)

lambda是一个匿名函数 - 相当于:

def get_score(entry):
    return entry[1]

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