2010-02-18 24 views
5

अजगर में, मैं की तरह मदों की एक सूची मिल गया है:पायथन: सूची में वस्तुओं की क्रमबद्ध गणना कैसे प्राप्त करें?

mylist = [a, a, a, a, b, b, b, d, d, d, c, c, e] 

और मैं चाहते हैं, उसके उत्पादन कुछ की तरह:

a (4) 
b (3) 
d (3) 
c (2) 
e (1) 

कैसे कर सकते हैं मैं उत्पादन एक गिनती और मदों की लीडरबोर्ड में एक सूचि? मैं दक्षता के बारे में भी परेशान नहीं हूं, किसी भी तरह से काम करता है :)

धन्यवाद!

+1

क्या आप की कोशिश की है? एसओ पर बहुत सारे डुप्ले हैं। क्या आपने कम से कम उनको ढूंढने की कोशिश की है? – SilentGhost

+0

हां मेरे पास है। क्षमा करें, मैं गलत खोज शब्दों का उपयोग कर रहा हूं लेकिन मुझे कुछ भी नहीं मिला जो मुझे चाहिए था। मैं प्रयोग कर रहा हूं लेकिन बहुत दूर नहीं मिला है ... माफी – AP257

+2

डुप्ली: http://stackoverflow.com/questions/2148480/can-pythons-list-comprehensions-ideally-do-the-equivalent-of-count- समूह/2148555 # 2148555 – SilentGhost

उत्तर

5
from collections import defaultdict 

def leaders(xs, top=10): 
    counts = defaultdict(int) 
    for x in xs: 
     counts[x] += 1 
    return sorted(counts.items(), reverse=True, key=lambda tup: tup[1])[:top] 

तो यह समारोह एक defaultdict का उपयोग करता हमारी सूची में प्रत्येक प्रविष्टि की संख्या की गणना करने के लिए। फिर हम प्रवेश की प्रत्येक जोड़ी लेते हैं और इसकी गिनती करते हैं और गिनती के अनुसार इसे अवरोही क्रम में क्रमबद्ध करते हैं। इसके बाद हम top प्रविष्टियों की संख्या लेते हैं और उसे वापस करते हैं।

तो अब हम कह सकते हैं

>>> xs = list("jkl;fpfmklmcvuioqwerklmwqpmksdvjioh0-45mkofwk903rmiok0fmdfjsd") 
>>> print leaders(xs) 
[('k', 7), ('m', 7), ('f', 5), ('o', 4), ('0', 3), ('d', 3), ('i', 3), ('j', 3), ('l', 3), ('w', 3)] 
+1

बिल्कुल सही। धन्यवाद – AP257

5

एक दो लाइनर:

for count, elem in sorted(((mylist.count(e), e) for e in set(mylist)), reverse=True): 
    print '%s (%d)' % (elem, count) 
संबंधित मुद्दे