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 つだけです -- 比較はタプルの 2 番目の (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 の目的です ;-) が、データを扱いやすくするために変換する価値があるかもしれません。