74 votes

La compréhension .méthode get() en python

sentence = "The quick brown fox jumped over the lazy dog."
characters = {}

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

print(characters)

Je ne comprends pas ce qu' characters.get(character,0) + 1 est fait, reste tout semble assez simple.

Merci

91voto

Alex Martelli Points 330805

L' get méthode de d'une dict (comme, par exemple, characters fonctionne exactement comme l'indexation de la dict, sauf que, si la clé est absente, au lieu de déclencher une KeyError il retourne la valeur par défaut (si vous appelez .get avec un seul argument, la touche, la valeur par défaut est None).

Donc un équivalent en Python de la fonction (où l'appelant myget(d, k, v) est juste comme d.get(k, v) peut-être:

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

L'exemple de code dans votre Q est clairement d'essayer de compter le nombre d'occurrences de chaque caractère: si elle dispose déjà d'un compte pour un caractère donné, get retourne (donc c'est incrémenté de un), d'autre get renvoie 0 (donc l'incrémentation correctement donne 1 à un personnage de la première occurrence de la chaîne).

26voto

zeyad elharabi Points 41

Pour comprendre ce qui se passe, nous allons prendre une lettre(répété plusieurs fois) dans la phrase de chaîne et de suivre ce qui se passe quand il passe à travers la boucle.

Rappelez-vous que nous avons commencer avec un vide caractères dictionnaire

characters = {}

Je vais choisir la lettre "e". Nous allons passer le caractère 'e' (qui se trouve dans la parole de L') pour la première fois dans la boucle. Je vais supposer que c'est le premier personnage à passer à travers la boucle et je vais remplacer les variables par leurs valeurs:

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

des personnages.get('e', 0) indique à python de rechercher la touche 'e' dans le dictionnaire. Si il ne l'est pas, elle retourne 0. Puisque c'est la première fois que le 'e' est passé au travers de la boucle, le caractère 'e' n'est pas trouvé dans le dictionnaire, de sorte que le obtenir la méthode retourne 0. Cette valeur 0 est ensuite ajouté à l' 1 (présent dans les caractères[personnage] = caractères.obtenir(caractère,0) + 1l'équation). Après la fin de la première boucle à l'aide de la " e " de caractère, nous avons maintenant une entrée dans le dictionnaire comme ceci: {'e': 1}

Le dictionnaire est maintenant:

characters = {'e': 1}

Maintenant, nous allons passer à la deuxième " e " (qui se trouve dans le mot sauté) par le biais de la même boucle. Je vais supposer que c'est le deuxième personnage à passer à travers la boucle et je vais mettre à jour les variables avec leurs valeurs nouvelles:

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

Ici l' obtenir méthode trouve une clé d'entrée pour les " e " et trouve sa valeur est 1. Nous ajoutons ceci à l'autre 1 en nombre de caractères.obtenir(caractère, 0) + 1 2 comme résultat.

Lorsque nous appliquons ce dans les caractères[personnage] = caractères.obtenir(caractère, 0) + 1 l'équation:

characters['e'] = 2

Il devrait être clair que la dernière équation assigne une nouvelle valeur 2 à la déjà présents touche 'e'. Par conséquent, le dictionnaire est maintenant:

characters = {'e': 2}

14voto

S.Lott Points 207588

Commencez ici http://docs.python.org/tutorial/datastructures.html#dictionaries

Alors ici http://docs.python.org/library/stdtypes.html#mapping-types-dict

Alors ici http://docs.python.org/library/stdtypes.html#dict.get

characters.get( key, default )

key is a character

default is 0

Si le personnage est dans le dictionnaire, characters, vous obtenez l'objet dictionary.

Si non, vous obtenez 0.

7voto

Ned Batchelder Points 128913

Si d est un dictionnaire, d.get(k, v) signifie, me donner la valeur de k en d, sauf si k n'est-il pas, dans ce cas donnez-moi v. Il est utilisé ici pour obtenir le nombre de personnage, qui devrait démarrer à 0 si le personnage n'a pas été rencontré auparavant.

4voto

Stick Points 1032

Je vois c'est une assez vieille question, mais cela ressemble à un de ces moments où quelque chose a été écrit sans la connaissance d'une fonctionnalité du langage. L' collections bibliothèque existe pour répondre à ces objectifs.

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})

Dans cet exemple, les places sont comptées, évidemment, mais si vous voulez ou non ces filtrée est à vous.

Comme pour l' dict.get(a_key, default_value), il y a eu plusieurs réponses à cette question particulière-cette méthode renvoie la valeur de la clé, ou la default_value vous l'offre. Le premier argument est la clé que vous cherchez, le deuxième argument est le comportement par défaut lorsque que la clé n'est pas présente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X