2011-02-01 21 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

आप एक बेहतर उदाहरण देना चाहिए। आपके में, लोकप्रियता का क्रम अंकों के प्राकृतिक क्रम जैसा ही है। यदि आपके पास दो नाइन थे, तो यह '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

@SilentGost - आप सही हैं। मैंने 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 दस्तावेज़ देख सकेंगे संगत कार्यान्वयन।

+2

आपको उल्लेख करना चाहिए कि 'काउंटर' केवल पायथन 2.7+ में उपलब्ध है। यहां प्री 2.7 के लिए एक कार्यान्वयन है: http://code.activestate.com/recipes/576611/ (या कोई सामान्य लूप और dict का उपयोग कर सकता है;)) –

+0

@ फ़ेलिक्स: 'काउंटर' से पहले,' डिफ़ॉल्ट 'है :) –

संबंधित मुद्दे