2010-08-16 18 views
96

मैं अजगर करने के लिए नया हूँ और मैं एक साधारण सवाल है, कहते हैं कि मैं मदों की एक सूची है:पायथन: एक शब्दकोश का उपयोग करना एक सूची में आइटम गिनती करने के लिए

['apple','red','apple','red','red','pear'] 

simpliest रास्ता जोड़ने के लिए क्या किसी शब्दकोश में आइटम सूचीबद्ध करें और सूची में आइटम कितनी बार प्रकट होता है।

तो सूची के लिए ऊपर मैं चाहूँगा उत्पादन होने के लिए:

{'apple': 2, 'red': 3, 'pear': 1} 
+1

आप प्रेरणा यहाँ प्राप्त कर सकते हैं: http : //stackoverflow.com/questions/2870466/python- हिस्टोग्राम-one-liner – mykhal

+0

http://stackoverflow.com/questions/13242103/how-to-compute-letter-frequency-in-a-string-using-pythons -बिल्ट-इन-मैप-एंड-रेडुक –

+0

क्या किसी ने आउटपुट के आदेश को नोटिस किया था? क्या यह अप्रासंगिक है? –

उत्तर

46
>>> L = ['apple','red','apple','red','red','pear'] 
>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> for i in L: 
... d[i] += 1 
>>> d 
defaultdict(<type 'int'>, {'pear': 1, 'apple': 2, 'red': 3}) 
+2

शायद सबसे तेज़ और कम से कम अव्यवस्थित विधि। –

3
L = ['apple','red','apple','red','red','pear'] 
d = {} 
[d.__setitem__(item,1+d.get(item,0)) for item in L] 
print d 

{'pear': 1, 'apple': 2, 'red': 3}

170

देता है 2.7 में और 3.1 इस उद्देश्य के लिए विशेष Counter dict है।

>>> from collections import Counter 
>>> Counter(['apple','red','apple','red','red','pear']) 
Counter({'red': 3, 'apple': 2, 'pear': 1}) 
+11

यक; पाइथन पुस्तकालय में पहले से ही पर्याप्त संकीर्ण उद्देश्य ब्लोट। –

+2

आधिकारिक रेखा, या बल्कि खड़े मजाक, यह है कि गिडो के पास समय मशीन है .. –

+8

@ ग्लेन मेनार्ड काउंटर सिर्फ ** मल्टीसेट ** का कार्यान्वयन है जो एक असामान्य डेटा संरचना आईएमओ नहीं है। वास्तव में, सी ++ में एसटीएल में 'std :: multiset' (' std :: tr1 :: unordered_multiset') नामक एक कार्यान्वयन है, इसलिए Guido इसके महत्व के बारे में उनकी राय में अकेला नहीं है। – awesomo

11

मैं हमेशा सोचा था कि एक काम है कि तुच्छ, मैं कुछ भी आयात करने के लिए नहीं चाहते हैं के लिए। लेकिन संग्रह के आधार पर मैं गलत हो सकता हूं। काउंटर तेजी से या नहीं।

items = "Whats the simpliest way to add the list items to a dictionary " 

stats = {} 
for i in items: 
    if i in stats: 
     stats[i] += 1 
    else: 
     stats[i] = 1 

# bonus 
for i in sorted(stats, key=stats.get): 
    print("%d×'%s'" % (stats[i], i)) 

मैं इस, गणना() का उपयोग करने के लिए बेहतर हो सकता है क्योंकि यह केवल एक बार iterable की चर्चा करेंगे, जबकि हर यात्रा पर पूरे बात की खोज कर सकते गिनती लगता है। मैंने सांख्यिकीय डेटा के कई मेगाबाइट को पार्स करने के लिए इस विधि का उपयोग किया और यह हमेशा उचित रूप से तेज़ था।

+1

आपका उत्तर अधिक योग्य है इसकी सादगी के लिए श्रेय। मैं थोड़ी देर के लिए इस पर संघर्ष कर रहा था, अन्य पुस्तकालयों आदि को आयात करने के लिए सुझाव देने वाले कुछ अन्य उपयोगकर्ताओं की उदासीनता से परेशान हो रहा था। – ntk4

92

मुझे पसंद है:

counts = dict() 
for i in items: 
    counts[i] = counts.get(i, 0) + 1 

.Get यदि कुंजी मौजूद नहीं है यदि आप एक डिफ़ॉल्ट मान निर्दिष्ट करने के लिए अनुमति देता है।

+6

उन नए लोगों के लिए। यह उत्तर समय जटिलता के मामले में बेहतर है। – curiousMonkey

+0

यह उत्तर फ़्लोटिंग पॉइंट नंबरों की सूची पर भी काम करता है, जहां कुछ संख्याएं '0' – SherylHohman

6

कैसे इस बारे में:

src = [ 'one', 'two', 'three', 'two', 'three', 'three' ] 
result_dict = dict([ (i, src.count(i)) for i in set(src) ]) 

यह

में जो परिणाम { 'एक': 1, 'तीन': 3, 'दो': 2}

+7

हो सकती हैं ध्यान दें कि 'एन (एन^2) '' '' '' '' '' के लिए कॉल 'sc.c.ount()' के कारण है। – dimo414

23

, बस \

i = ['apple','red','apple','red','red','pear'] 
d = {x:i.count(x) for x in i} 
print d 

उत्पादन सूची संपत्ति गिनती का उपयोग करें: { 'नाशपाती': 1, 'सेब': 2, 'लाल': 3}

+2

हालांकि यह काम करता है, ऐसा लगता है कि यह अक्षम होगा। – Ouroborus

+0

क्या आप विस्तृत कर सकते हैं? –

+0

आप सरणी के खिलाफ 'गिनती' को कई बार लागू कर रहे हैं एसआर आइटम हैं। आपका समाधान 'ओ (एन^2)' है जहां बेहतर मामूली समाधान 'ओ (एन) 'है। [Riviera के उत्तर] पर टिप्पणियां देखें (https://stackoverflow.com/a/9604768/367865) [mmdreg के उत्तर] पर टिप्पणी बनाम (https://stackoverflow.com/a/6582852/367865)। – Ouroborus

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