2011-09-01 5 views
21

मुझे सूची समझ के बारे में पता है, शब्दकोश समझ के बारे में क्या?क्या पाइथन में शब्दकोश की समझ है? (फंक्शन लौटने वाले फंक्शन के साथ समस्या)

अपेक्षित आउटपुट:

>>> countChar('google') 
    {'e': 1, 'g': 2, 'l': 1, 'o': 2} 
    >>> countLetters('apple') 
    {'a': 1, 'e': 1, 'l': 1, 'p': 2} 
    >>> countLetters('') 
    {} 

संहिता (मैं अभी शुरुआत कर रहा हूँ):

def countChar(word): 
    l = [] 
    #get a list from word 
    for c in word: l.append(c) 
    sortedList = sorted(l) 
    uniqueSet = set(sortedList) 
    return {item:word.count(item) for item in uniqueSet } 

इस कोड के साथ क्या समस्या है? मुझे यह SyntaxError क्यों मिलता है?

return { item:word.count(item) for item in uniqueSet } 
^ 
SyntaxError: invalid syntax 
+1

सिंटेक्स त्रुटि अतिरिक्त ')' है: 'word.count (आइटम))' –

+1

corrected.but अभी भी समस्या मिल गया – newbie

+0

y कर सकते हैं आप जिस वास्तविक त्रुटि को प्राप्त कर रहे हैं उसे पेस्ट करें? – SingleNegationElimination

उत्तर

29

संपादित: जैसा कि एजीएफ़ टिप्पणियों और अन्य जवाब में बताया, वहाँ अजगर 2.7 या नए के लिए एक शब्दकोश समझ है।

def countChar(word): 
    return dict((item, word.count(item)) for item in set(word)) 

>>> countChar('google') 
{'e': 1, 'g': 2, 'o': 2, 'l': 1} 
>>> countChar('apple') 
{'a': 1, 'p': 2, 'e': 1, 'l': 1} 

एक सूची word बदल सकते हैं या यह एक सेट में तब्दील होने से पहले ही सॉर्ट के बाद से तार iterable हैं की कोई जरूरत नहीं है:

>>> set('google') 
set(['e', 'o', 'g', 'l']) 

वहाँ अजगर के लिए 2.6 और नीचे के साथ कोई शब्दकोश समझ है, यही कारण है कि आप वाक्यविन्यास त्रुटि देख रहे हैं। विकल्प एक समझ या जनरेटर का उपयोग करके कुंजी-मूल्य tuples की एक सूची बनाने और dict() अंतर्निर्मित में गुजरना है।

+0

आपका कोड, यह बहुत छोटा है, यह काम करता है, लेकिन मैं एक नौसिखिया हूं, क्या आप शुरुआत के लिए अन्य तरीके हैं। – newbie

+1

@ न्यूवी - मैंने इसे 'लैम्ब्डा' होने से सामान्य फ़ंक्शन परिभाषा में बदल दिया, मैं कुछ अतिरिक्त स्पष्टीकरण जोड़ूंगा। –

+0

आपकी व्याख्या के लिए धन्यवाद। – newbie

60

आप अजगर 2.7 या नए पर हैं:

{item: word.count(item) for item in set(word)} 

ठीक काम करता है। आपको इसे सेट करने से पहले सूची को सॉर्ट करने की आवश्यकता नहीं है। आपको शब्द को सूची में बदलने की भी आवश्यकता नहीं है। इसके अलावा, आप इसके बजाय collections.Counter(word) का उपयोग करने के लिए एक नए पर्याप्त पायथन पर हैं।

आप अजगर के एक पुराने संस्करण का उपयोग कर रहे हैं, तो आप dict comprehensions उपयोग नहीं कर सकते, तो आप dict निर्माता के साथ एक जनरेटर अभिव्यक्ति का उपयोग करने की आवश्यकता है:

dict((item, word.count(item)) for item in set(word)) 

यह अभी भी आप word से अधिक पुनरावृति करने की आवश्यकता है len(set(word)) बार, तो कुछ इस तरह का प्रयास करें:

from collections import defaultdict 
def Counter(iterable): 
    frequencies = defaultdict(int) 
    for item in iterable: 
     frequencies[item] += 1 
    return frequencies 
+5

पायथन का वाक्यविन्यास हमेशा मुझे ऐसा लगता है कि मैं ' मैं धोखा दे रहा हूँ। अन्य भाषाओं को यह सरल क्यों नहीं है? – ArtOfWarfare

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