2017-02-19 9 views
2

は、私はこのようなリストを持っている:最も高い頻度のすべての要素を見つけるためのPythonの方法?

lst = [1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4] 

は、私が最も頻繁に発生すべての要素を見つけるしたいと思います。 だから私は希望:

most = [1, 3, 5] 

1、3、5は4倍である、ほとんどが発生するであろう。これを行うための高速な、pythonicな方法は何ですか?私はここに示す方法を試した:

How to find most common elements of a list?

しかし、それは私にトップ3を与え、私はすべての要素が必要です。ありがとうございました。

+0

リンクに答えるスライス 'popular_wordsを[ありません] 'を返します。実際のカウンタには、トップ3だけでなく、すべての合計が含まれます。 – krock

答えて

7
collections.Counter

リスト内包:効率的に反復するために、大規模なイテラブルのために

c = Counter(lst) 
m = max(c.values()) 
r = [k for k in c if c[k] == m] 
print(r) 
# [1, 3, 5] 

:あなたはカウンタ値にmaxを使用して、最高のカウントと値のために一般化することができます

from collections import Counter 

lst = [1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4] 
r = [x for x, _ in Counter(lst).most_common(3)] 
print(r) 
# [1, 3, 5] 

カウンターを通過して必要な項目を取り終えたら、itertools.takewhilemost_commonをパラメータなしで使用することができます:

あなたが ソート most_commonを使用してアイテムを持ついくつかのオーバーヘッドがあるが、カウンターオブジェクトのすべての項目を反復処理する必要がないことによって得る
from itertools import takewhile 

c = Counter(lst) 
m = max(c.values()) 
r = [x for x, _ in takewhile(lambda x: x[1]==m, c.most_common())] 
print(r) 
# [1, 3, 5] 

。結局のところなら絶対に効率的です。 timeitでいくつかの実験を行うことができます。あなたはすべての最も頻繁に印刷したい場合は、次の操作を行うことができます

+0

これは動作しますが、最初の3つではなく、最も頻繁に発生する**すべての**要素を検索したいと思います。 ありがとう、結構です。 –

+0

@ArjunVasudevan私は一般的なケースのために更新しました –

0

from collections import Counter 
    words=[1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4] 
    most= [word for word, word_count in Counter(words).most_common()] 
    print (most) 
>>> 
[1, 3, 5, 4, 2, 6] 

は、あなたが制限したい場合は、あなたがmost_common()関数の内部番号を入力することができ、注意してください。例:...most_common(3)]。希望があなたの質問に答えることを望みます。

1

ます。また、このようにitertoolsモジュールとlist comprehensionからgroupbyと同じ結果を得ることができます。

from itertools import groupby 

a = [1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4] 
most_common = 3 
final = [k for k,v in groupby(sorted(a), lambda x: x) if len(list(v)) > most_common] 

出力:3:

print(final) 
>>> [1, 3, 5] 
+1

これは既にあなたが先験的に閾値を持っていることを前提としています –

+0

はい。それは本当です。しかし、すべてのケースを処理するために拡張することができます。 –

関連する問題