De .get()-methode in Python begrijpen

Ik begrijp niet wat characters.get(character, 0) + 1doet, de rest lijkt vrij eenvoudig.


Antwoord 1, autoriteit 100%

De getmethode van een dict (zoals bijvoorbeeld characters) werkt net als het indexeren van het dict, behalve dat, als de sleutel ontbreekt, in plaats van een KeyErrorhet retourneert de standaardwaarde (als je .getaanroept met slechts één argument, de sleutel, is de standaardwaarde None).

Dus een equivalente Python-functie (waarbij het aanroepen van myget(d, k, v)net zo is als d.get(k, v)zou kunnen zijn:

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

De voorbeeldcode in uw vraag probeert duidelijk het aantal keren dat elk teken voorkomt te tellen: als het al een telling heeft voor een bepaald teken, geeft gethet terug (dus het wordt gewoon met één verhoogd ), else getretourneert 0 (dus de juiste ophoging geeft 1bij de eerste keer dat een teken in de tekenreeks voorkomt).


Antwoord 2, autoriteit 30%

Om te begrijpen wat er aan de hand is, nemen we één letter (meer dan eens herhaald) in de tekenreeks zinen volgen wat er gebeurt als deze door de lus gaat.

Vergeet niet dat we beginnen met een leeg tekenswoordenboek

characters = {}

Ik kies de letter ‘e’. Laten we het teken ‘e’ (te vinden in het woord The) voor de eerste keer door de lus halen. Ik ga ervan uit dat dit het eerste teken is dat door de lus gaat en ik zal de variabelen vervangen door hun waarden:

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

characters.get(‘e’, 0)vertelt python om te zoeken naar de sleutel ‘e’ in het woordenboek. Als het niet wordt gevonden, retourneert het 0. Aangezien dit de eerste keer is dat ‘e’ door de lus gaat, is het teken ‘e’ nog niet gevonden in het woordenboek, dus de get-methode retourneert 0. Deze 0 waarde wordt dan toegevoegd aan de 1(aanwezig in de characters[character] = characters.get(character,0) + 1vergelijking).
Na voltooiing van de eerste lus met het ‘e’-teken, hebben we nu een vermelding in het woordenboek als volgt: {‘e’: 1}

Het woordenboek is nu:

characters = {'e': 1}

Laten we nu de tweede ‘e’ (te vinden in het woord gesprongen) door dezelfde lus halen. Ik neem aan dat dit het tweede teken is dat door de lus gaat en ik zal de variabelen bijwerken met hun nieuwe waarden:

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

Hier vindt de get-methode een sleutelinvoer voor ‘e’ en vindt de waarde die 1 is.
We voegen dit toe aan de andere 1in characters.get(character, 0) + 1en krijgen 2 als resultaat.

Als we dit toepassen in de tekens[character] = characters.get(character, 0) + 1 vergelijking:

characters['e'] = 2

Het moet duidelijk zijn dat de laatste vergelijking een nieuwe waarde 2 toekent aan de reeds aanwezige ‘e’-toets.
Daarom is het woordenboek nu:

characters = {'e': 2}

Antwoord 3, autoriteit 17%

Begin hier http://docs.python.org/tutorial/datastructures.html# woordenboeken

Hier dan http://docs.python.org/library/ stdtypes.html#mapping-types-dict

Hier dan http://docs.python.org/library/stdtypes. html#dict.get

characters.get( key, default )
key is a character
default is 0

Als het teken in het woordenboek staat, characters, krijg je het woordenboekobject.

Zo niet, dan krijg je 0.


Syntaxis:

get(key[, default])

Retourneer de waarde voor sleutel als sleutel in het woordenboek staat, anders standaard. Als de standaardwaarde niet is opgegeven, wordt deze standaard ingesteld op None, zodat deze methode nooit een KeyErroroplevert.


Antwoord 4, autoriteit 7%

Als d een woordenboek is, dan betekent d.get(k, v): geef me de waarde van k in d, tenzij k er niet is, in welk geval geef me v. Het wordt hier gebruikt om de huidige telling van het personage te krijgen, die moet beginnen bij 0 als het personage nog niet eerder is tegengekomen.


Antwoord 5, autoriteit 5%

Ik zie dat dit een vrij oude vraag is, maar dit lijkt op een van die keren dat iets is geschreven zonder kennis van een taalfunctie. De bibliotheek collectionsbestaat om deze doelen te bereiken.

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

In dit voorbeeld worden de spaties natuurlijk geteld, maar of je die gefilterd wilt hebben, is aan jou.

Wat betreft de dict.get(a_key, default_value), er zijn verschillende antwoorden op deze specifieke vraag geweest — deze methode retourneert de waarde van de sleutel, of de default_value die u opgeeft. Het eerste argument is de sleutel die u zoekt, het tweede argument is de standaardwaarde voor wanneer die sleutel niet aanwezig is.

Other episodes