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

Han*_*son 7 python tuples list

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

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

谢谢.

mgi*_*son 11

heapq.nlargest 这就是你想要的:

import heapq
from operator import itemgetter
largest_names = [x[0] for x in heapq.nlargest(6,your_list,key=itemgetter(1))]
Run Code Online (Sandbox Code Playgroud)

它将比排序更有效,因为它只需要最大的元素并丢弃其余元素.当然,如果列表由于其他原因而预先排序,则它比切片效率低.

复杂:

  • heapq:O(N)
  • 排序:O(NlogN)
  • 切片(仅在预先排序时):O(6)

说明:

heapq.nlargest(6,your_list,key=itemgetter(1)) 
Run Code Online (Sandbox Code Playgroud)

该行返回(名称,值)元组的列表,但只返回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)]
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*ira 1

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

first_six = data[0:6]  # or data[:6]
only_names = [entry[0] for entry in first_six]
Run Code Online (Sandbox Code Playgroud)

列表理解可以展开为:

only_names = []
for entry in first_six:
    only_names.append(entry[0])
Run Code Online (Sandbox Code Playgroud)

如果列表尚未排序,您可以使用该方法(或内置方法)key的关键字参数按分数排序:sortsorted

data.sort(key=lambda entry: entry[1], reverse=True)
Run Code Online (Sandbox Code Playgroud)

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

def get_score(entry):
    return entry[1]

data.sort(key=get_score, reverse=True)
Run Code Online (Sandbox Code Playgroud)