web-dev-qa-db-ja.com

Python:リストから最大N個の要素を取得

いくつかのリストからN個の最も高い要素を返す関数はありますか?

つまりmax(l)が単一の最高要素sthを返す場合。 max(l, count=10)のようにすると、上位10個の数値のリストが返されます(lが小さい場合はそれよりも少ない)。

または、これらを取得する効率的な簡単な方法は何でしょうか? (明らかな標準的な実装を除いて、リスト全体を最初にソートすることは、標準的なソリューションと比較して非効率であるため、そのようなことはありません。)

36
Albert

heapq.nlargest

>>> import heapq, random
>>> heapq.nlargest(3, (random.gauss(0, 1) for _ in xrange(100)))
[1.9730767232998481, 1.9326532289091407, 1.7762926716966254]
55
Gareth Rees

これを行う標準ライブラリの関数は heapq.nlargest

6
Dave Webb

Lの最初の10から始めて、そのXを呼び出します。Xの最小値に注意してください。

L [i]をiだけループして、残りのLをループします。

L [i]がmin(X)より大きい場合、Xからmin(X)を削除し、L [i]を挿入します。 Xをソートされたリンクリストとして保持し、挿入を行う必要がある場合があります。 min(X)を更新します。

最後に、Xに最大の10個の値があります。

挿入ソートは線形であるため、O(kN)(kはここでは10))になると思います。gslが使用するものである可能性があるため、Cコードを読み取ることができます。

http://www.gnu.org/software/gsl/manual/html_node/Selecting-the-k-smallest-or-largest-elements.html

おそらくこれを行う派手なもの。

3
Spacedman

かなり効率的なソリューションは、ピボットポイントの位置が必要な要素の数よりも高くなるまで再帰がピボットの右側に制限されるクイックソートのバリエーションです(もちろん、境界のケースを処理するためのいくつかの追加条件があります)。

標準ライブラリにはheapq.nlargest、他の人がここで指摘したように。