2012-10-09 66 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的良好用法 –

相關問題