2011-09-01 7 views
21

Sé acerca de la lista de comprensiones, ¿qué hay de las comprensiones del diccionario?¿Hay comprensión de diccionarios en Python? (Problema con la función que devuelve el dict)

Resultados esperados:

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

Código (soy un principiante):

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 } 

¿Cuál es el problema con este código? ¿Por qué obtengo este SyntaxError?

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

el error de sintaxis es el extra ')': 'word.count (elemento))' –

+1

corrected.but todavía tiene problemas – newbie

+0

Lata y ¿O pega el error real que está recibiendo? – SingleNegationElimination

Respuesta

29

edición: Como AGF señaló en los comentarios y la otra respuesta, hay un diccionario por comprensión para Python 2.7 o posterior.

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} 

No hay necesidad de convertir word a una lista o solucionar el problema antes de convertirlo en un conjunto dado que las cadenas son iterable:

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

no hay comprensión diccionario con para Python 2.6 y por debajo, que podría ser el motivo por el que está viendo el error de sintaxis. La alternativa es crear una lista de tuplas de clave-valor usando una comprensión o generador y pasar eso al dict() incorporado.

+0

su código, es demasiado corto, funciona, pero yo soy un principiante, tengo otras formas para principiantes. – newbie

+1

@newbie - Lo cambié de ser un 'lambda' a una definición de función normal, añadiré alguna explicación adicional. –

+0

Gracias por su explicación. – newbie

60

Si estás en Python 2.7 o posterior:

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

funciona bien. No necesita ordenar la lista antes de configurarla. Tampoco necesita convertir la palabra en una lista. Además, estás en un Python lo suficientemente nuevo como para usar collections.Counter(word).

Si estás en una versión anterior de Python, no se puede utilizar dict por comprensión, es necesario utilizar una expresión generador con el dict constructor:

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

Esto todavía requiere que iterar sobre wordlen(set(word)) veces, por lo que intentar algo como:

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

La sintaxis de Python siempre me hace sentir como si ' m hacer trampa. ¿Por qué no son otros idiomas así de simple? – ArtOfWarfare

Cuestiones relacionadas