2012-10-09 67 views
7

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

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

谢谢。

回答

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

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

​​

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

def get_score(entry): 
    return entry[1] 

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

没有必要在该片中包含0,即使.. –

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

哪个不如下:使用key功能

  • sorted返回的数据进行排序。由于标准排序顺序是从升序,reverse=True设置它下降;
  • lambda x: x[1]是一个匿名函数,它返回参数(在这种情况下为元组的)第二个元素; itemgetter(1)是更好的方式来做到这一点,但需要额外的进口;
  • [0:6]切片前6个元素的列表;
  • [x[0] for x in ... ]创建每个传递元组的第一个元素的列表;
+0

如果你能解释你的代码,这将是很好的。初学者可能很难理解正在发生的事情。 – WarrenFaith

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

此行返回(名称,值)tu但只有6个最大的元素 - 比较是通过元组中的第二个(index = 1 - >key=itemgetter(1))元素完成的。

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


您可能有兴趣将此数据存储为collections.Counter

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

它可能不值得转换只是做这个计算(这是heapq是毕竟;-)什么,但它可能是值得转换为使数据更容易使用。

+1

绝对是heapq和解释+1的良好用法 –

相关问题