2010-01-14 15 views
54
sentence = "The quick brown fox jumped over the lazy dog." 
characters = {} 

for character in sentence: 
    characters[character] = characters.get(character, 0) + 1 

print(characters) 

No entiendo qué está haciendo characters.get(character, 0) + 1, el resto parece bastante sencillo.Comprender el método .get() en Python

Respuesta

68

El método de un dict get (como por ejemplo characters) funciona igual que la indexación de la dict, excepto que, si la clave no está presente, en lugar de elevar un KeyError devuelve el valor por defecto (si se llama a .get con solo un argumento, la clave, el valor predeterminado es None).

lo tanto, una función de Python equivalente (donde llamar myget(d, k, v) es igual d.get(k, v) podría ser:

def myget(d, k, v=None): 
    try: return d[k] 
    except KeyError: return v 

El código de ejemplo en su pregunta está claramente tratando de contar el número de apariciones de cada personaje: si ya tiene un recuento de un carácter determinado, get lo devuelve (lo que es sólo incrementa en uno), de lo contrario get devuelve 0 (por lo que el incremento da correctamente 1 en la primera ocurrencia de un carácter en la cadena).

9

de inicio aquí http://docs.python.org/tutorial/datastructures.html#dictionaries

Entonces aquí http://docs.python.org/library/stdtypes.html#mapping-types-dict

Entonces aquí http://docs.python.org/library/stdtypes.html#dict.get

characters.get(key, default) 

key is a character 

default is 0 

Si el personaje está en el diccionario, characters, se obtiene el objeto de diccionario.

Si no es así, se obtiene 0.


Sintaxis:

get(key[, default])

Devuelve el valor de la clave si la clave está en el diccionario, de lo predeterminado. Si no se proporciona el valor predeterminado, se establece de manera predeterminada en None, por lo que este método nunca generará un KeyError.

6

Si d es un diccionario, luego d.get(k, v) significa, dame el valor de k en d, a menos que k no esté allí, en cuyo caso dame v. Se está usando aquí para obtener el conteo actual del personaje, que debe comenzar en 0 si el personaje no tiene encontrado antes

18

Para entender lo que está sucediendo, tomemos una letra (repetida más de una vez) en la cadena de ora y sigamos lo que sucede cuando pasa por el ciclo.

Recuerde que partimos de un vacío caracteres diccionario

characters = {} 

voy a escoger la letra 'e'. Pase el carácter 'e' (que se encuentra en la palabra The) por primera vez a través del ciclo.Voy a asumir que es el primer carácter que pasar por el bucle y voy a sustituir las variables con sus valores:

for 'e' in "The quick brown fox jumped over the lazy dog.": 
    {}['e'] = {}.get('e', 0) + 1 

characters.get ('e', ​​0) le dice a Python que buscar la clave ' e 'en el diccionario. Si no se encuentra, devuelve 0. Como esta es la primera vez que se pasa una 'e' a través del bucle, el carácter 'e' no se encuentra aún en el diccionario, por lo que el obtiene método devuelve 0. Este 0 valor es entonces agregado al (presente en los caracteres [character] = characters.get (character, 0) + ecuación). Después de la finalización del primer bucle que utiliza el carácter 'e', ​​ahora tenemos una entrada en el diccionario como esto: { 'e': 1}

El diccionario es ahora:

characters = {'e': 1} 

Ahora, pasemos la segunda 'e' (encontrada en la palabra saltada) a través del mismo bucle. Vamos a suponer que es el segundo personaje que pasar por el bucle y voy a actualizar las variables con sus nuevos valores:

for 'e' in "The quick brown fox jumped over the lazy dog.": 
    {'e': 1}['e'] = {'e': 1}.get('e', 0) + 1 

Aquí el método obtener encuentra una entrada de clave para 'e' y encuentra su valor que es 1. Añadimos esto al otro en characters.get (character, 0) + y obtenemos 2 como resultado.

Cuando aplicamos esto en los caracteres [personaje] = characters.get (carácter, 0) + 1 ecuación:

characters['e'] = 2 

Debe quedar claro que la última ecuación asigna un nuevo valor 2 a la ya Presente la tecla 'e'. Por lo tanto el diccionario es ahora:

characters = {'e': 2} 
2

Veo esto es una pregunta bastante antiguo, pero esto se parece a una de esas veces cuando algo se ha escrito sin el conocimiento de una característica del lenguaje. La biblioteca collections existe para cumplir estos propósitos.

from collections import Counter 
letter_counter = Counter() 
for letter in 'The quick brown fox jumps over the lazy dog': 
    letter_counter[letter] += 1 

>>> letter_counter 
Counter({' ': 8, 'o': 4, 'e': 3, 'h': 2, 'r': 2, 'u': 2, 'T': 1, 'a': 1, 'c': 1, 'b': 1, 'd': 1, 'g': 1, 'f': 1, 'i': 1, 'k': 1, 'j': 1, 'm': 1, 'l': 1, 'n': 1, 'q': 1, 'p': 1, 's': 1, 't': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1}) 

En este ejemplo, los espacios se están contando, obviamente, pero si usted quiere o no los filtrados depende de usted.

En cuanto al dict.get(a_key, default_value), ha habido varias respuestas a esta pregunta en particular: este método devuelve el valor de la clave, o el valor predeterminado que usted proporciona. El primer argumento es la clave que está buscando, el segundo argumento es el predeterminado para cuando esa clave no está presente.

Cuestiones relacionadas