2011-02-01 7 views
6
を削除

可能性の重複:私はリストをソートする簡単な方法を探しています
In python, how do I take the highest occurrence of something in a list, and sort it that way?ソート人気順、リストを取り、その後、重複

こんにちはすべて、

人気度で削除し、重複した要素を削除します。

[8, 8, 1, 1, 5, 8, 9] 

私は、次のようなリストで終わるでしょう:リストを与え例えば

[8, 1, 5, 9] 
+0

あなたはより良い例を与える必要があります。あなたの中で、人気の順番は、数字の自然順番と同じです。あなたが2つのナインを持っていたら、それは '[1,3,9,5]'でしょうか? –

+0

はい。混乱させて申し訳ありません! –

+0

@kahm:人気順でリストをソートすることはできません。カウントを含む他の中間構造を作成する必要があります。どのような構造を見ましたか? –

答えて

12

@SilentGhostは、Python 2.7+の優れたソリューションです。 2.6およびそれ以前のための比較的簡単な解決策:

a = [8, 8, 1, 1, 5, 8, 9] 

popularity = sorted(set(a), key=lambda x: -a.count(x)) 

[8, 1, 5, 9] 

このソリューションは、(理由countの)、しかし、高価です。ここで

別の、一時的な辞書とのより良い解決策:

a = [8, 8, 1, 1, 5, 8, 9] 
d = {} 
for i in a: 
    d[i] = d.get(i, 0) + 1 
popularity = sorted(d, key=d.get, reverse=True) 
+5

これは大きなリストには非常に高価です。 – SilentGhost

+0

@SilentGhost - あなたが正しいです。私はdictでより良い解決法を追加しました。 – eumiro

+1

私は 'key = d.get'で十分だと思います。 – SilentGhost

13
>>> lst = [1, 1, 3, 3, 5, 1, 9] 
>>> from collections import Counter 
>>> c = Counter(lst) 
>>> [i for i, j in c.most_common()] 
[1, 3, 5, 9] 

レガシーへのリンクについてcollections.Counterのドキュメントを参照してくださいversions-互換性のある実装です。

+2

'Counter 'はPython 2.7以降でのみ利用可能です。前の2.7の実装は次のとおりです:http://code.activestate.com/recipes/576611/(または普通のループとdictを使うことができます)) –

+0

@Felix: 'Counter'の前に' defaultdict'があります:) –

関連する問題