7

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

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

谢谢你。

4

3 回答 3

11

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)

解释:

heapq.nlargest(6,your_list,key=itemgetter(1)) 

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

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


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

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

仅仅为了做这个计算可能不值得转换(这毕竟是 heapq 的用途 ;-),但它可能值得转换以使数据更易于使用。

于 2012-10-09T13:45:25.473 回答
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 ... ]创建每个传递的元组的第一个元素的列表;
于 2012-10-09T13:44:53.343 回答
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关键字参数按分数排序:sortsorted

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

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

def get_score(entry):
    return entry[1]

data.sort(key=get_score, reverse=True)
于 2012-10-09T13:43:48.913 回答