2011-02-01 21 views
6
kaldırmak

Olası Çoğalt: Bir liste sıralamak için kolay bir yol arıyorum
In python, how do I take the highest occurrence of something in a list, and sort it that way?sıralama popülerliğe göre, bir liste atın ve daha sonra çiftleri

Herkese selam

popülerliğe göre ve daha sonra yinelenen öğeleri kaldırın. Bir liste Verilen örnek için

:

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

Sonra böyle bir liste ile sona ereceğini aşağıdadır:

[8, 1, 5, 9] 
+0

Daha iyi bir örnek vermek gerekir. Sizinki, popülerlik sırası, rakamların doğal düzeni ile aynıdır. İki tane dokuz olsaydınız, [1,3,9,5] 'olur mu? –

+0

Evet. karışıklık için özür dilerim! –

+0

@kahm: Bir listeyi popülariteye göre sıralayamazsınız. Sayıları içeren başka bir ara yapı oluşturmalısınız. Başka hangi yapılara baktın? –

cevap

12

@SilentGhost, Python 2.7+ için mükemmel bir çözümdür. 2.6 ve üstü için nispeten basit bir çözüm: Bu çözelti, ancak,

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

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

[8, 1, 5, 9] 

, (nedeniyle count arasında) pahalı.

Burada başka, geçici sözlükle daha iyi bir çözüm:

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

Bu büyük listeler için çok pahalı. – SilentGhost

+0

@SilentGhost - haklısınız. Dict ile daha iyi bir çözüm ekledim. – eumiro

+1

"Anahtar = d.get" yeterli olacağını düşünüyorum. – 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] 

mirası bağlantılar versions- için collections.Counter dokümanlar bakın uyumlu uygulamalar.

+2

'Counter''in sadece Python 2.7+ sürümünde mevcut olduğundan bahsetmelisiniz. İşte ön 2.7 için bir uygulama: http://code.activestate.com/recipes/576611/ (ya da sadece normal bir döngü ve dict kullanabilirsiniz;)) –

+0

@Felix: 'Counter' önce,' defaultdict' var :) –

İlgili konular