2011-09-01 13 views
21

Liste kavramalarını biliyorum, sözlükle ilgili ne anlama geliyor?Python'da sözlük anlaşmaları var mı? (Dict dönen fonksiyonla ilgili problem)

Beklenen Çıktı:

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

Kodu (Ben bir acemi değilim):

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 } 

bu kodla problemi nedir? Neden bu SyntaxError'u aldım?

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

sözdizimi hatası ')' ekstra: –

+1

corrected.but hala sorunlar var 'word.count (madde))' – newbie

+0

y Can aldığınız asıl hatayı yapıştırın mı? – SingleNegationElimination

cevap

29

düzenlemek: agf yorumlar ve diğer yanıtında belirttiği gibi, Python 2.7 veya daha yeni bir sözlük anlama var.

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} 

bir listeye word dönüştürmek veya dizeleri tekrarlanabilir olduğundan beri bir dizi dönüştürerek önce sıralamak için gerek yoktur:

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

aşağıda Python için 2.6, hiçbir sözlük anlama yoktur, Bu yüzden sözdizimi hatası görüyorsunuz. Alternatif, bir anlama veya üreteci kullanarak ve bunu dahili olarak dict() içine aktaran anahtar/değer tuplesinin bir listesini oluşturmaktır.

+0

kodunuzu içe aktarın, kodunuz çok kısa, işe yarıyor ama ben yeni başlayan biriyim, yeni başlayanlar için başka yollara sahibim. – newbie

+1

@newbie - Bir lambda'dan normal bir işlev tanımına geçtim, biraz ek açıklama ekleyeceğim. –

+0

Açıklamanız için teşekkürler. – newbie

60

Eğer Python 2.7 veya daha yeni iseniz:

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

çalışıyor. Ayarlamadan önce listeyi sıralamanız gerekmez. Kelimeyi bir listeye çevirmenize de gerek yoktur. Ayrıca, bunun yerine collections.Counter(word)'u kullanmak için yeterince yeni bir Python kullanıyorsunuz. Eğer Python eski bir sürümünü kullanıyorsanız

, sen dict comprehensions kullanamaz, sen dict kurucu ile jeneratör ifadesini kullanmak gerekir:

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

Bu hala word tekrarlatacak gerektirir len(set(word)) kere gibi bir şey denemek, bu yüzden:

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

Python'un sözdizimi her zaman benim gibi hissettiriyor m hile. Neden diğer diller bu kadar basit değil? – ArtOfWarfare

İlgili konular