2013-04-15 5 views
8

मूल रूप से अगर एक सूची दी:डुप्लिकेट को खत्म करते समय घटना की आवृत्ति और वर्णानुक्रम (टाई के मामले में) द्वारा सूची व्यवस्थित करने के लिए कैसे करें?

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 

मैं एक समारोह है कि इस प्रकार की सूची देता है बनाने के लिए कोशिश कर रहा हूँ:

["apple", "pear", "banana", "cherry"] 

मैं वापसी सूची सबसे अक्सर द्वारा आदेश दिया करने के लिए कोशिश कर रहा हूँ वर्णमाला के क्रम में संबंधों को तोड़ने के दौरान पहली बार शब्द हो रहा है। मैं डुप्लिकेट को खत्म करने की कोशिश भी कर रहा हूं।

मैंने पहले से ही प्रत्येक तत्व की गणना और डेटा में प्रत्येक तत्व के सूचकांक की सूचियां बनाई हैं।

x = [n.count() for n in data] 
z = [n.index() for n in data] 

मुझे नहीं पता कि इस बिंदु से कहां जाना है।

+2

यह होमवर्क की तरह लगता है। शायद आपको अपना अन्य प्रश्न देखना चाहिए http://stackoverflow.com/questions/16006404/how-to-find-most-common-element-in-list-and-if-theres-a-tie-the-one-whos -las/16006441 # 16006441 – Jeff

उत्तर

16

आप कुछ इस तरह कर सकता है:

from collections import Counter 

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 

counts = Counter(data) 
words = sorted(counts, key=lambda word: (-counts[word], word)) 

print words 
+1

+1 यह एकमात्र उत्तर है जिसमें ओपी के लिए टाई ब्रेकर है। – hughdbrown

+0

बहुत अच्छा समाधान – jamylak

+0

मैं थोड़ी उलझन में हूं कि क्रमबद्ध() फ़ंक्शन में, प्रोग्राम "शब्द" को "गणना" शब्दकोश में अलग-अलग कुंजियों से जोड़ता है। – Sean

3

आवृत्ति द्वारा तत्वों आप उपयोग कर सकते हैं, collections.most_common प्रलेखन here आदेश देने के लिए, तो उदाहरण के लिए @Yuushi को

from collections import Counter 

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 
print Counter(data).most_common() 
#[('apple', 3), ('pear', 2), ('cherry', 1), ('banana', 1)] 

धन्यवाद,

from collections import Counter 

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 
x =[a for (a, b) in Counter(data).most_common()] 

print x 
#['apple', 'pear', 'cherry', 'banana'] 
+0

+1, लेकिन इसे ओपी चाहता प्रारूप में प्राप्त करने के लिए, आप काउंटर (डेटा) में 'x = [a for a (a, b) जैसे कुछ करना चाहते हैं .most_common()] ' – Yuushi

+0

मैंने यह कोशिश की पहले, लेकिन 'चेरी' और 'केला' को चारों ओर बदल दिया जा रहा है। – Blender

+1

या: ऑपरेटर आयात itemgetter से; एक्स = मैप (itemgetter (0), काउंटर (डेटा) .most_common()) 'इसके अलावा, यह कोड टाई ब्रेकर ओपी को लागू नहीं करता है। – hughdbrown

0

यहां एक आसान दृष्टिकोण है, लेकिन इसे काम करना चाहिए।

data = ["apple", "pear", "cherry", "apple", "pear", "apple", "banana"] 

from collections import Counter 
from collections import defaultdict 

my_counter = Counter(data) 

# creates a dictionary with keys 
# being numbers of occurrences and 
# values being lists with strings 
# that occured a given time 
my_dict = defaultdict(list) 
for k,v in my_counter.iteritems(): 
    my_dict[v].append(k) 

my_list = [] 

for k in sorted(my_dict, reverse=True): 
    # This is the second tie-break, if both 
    # strings showed up the same number of times 
    # and correspond to the same key, we sort them 
    # by the alphabetical order 
    my_list.extend(sorted(my_dict.get(k))) 

परिणाम:

>>> my_list 
['apple', 'pear', 'banana', 'cherry'] 
+0

@jamylak मुझे यह नहीं पता था। धन्यवाद। – Akavall

+0

यदि आप चाहें तो अपने कोड को अपडेट करने के लिए स्वतंत्र महसूस करें – jamylak

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

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