Compreensao.método get () em Python [duplicado]

esta pergunta já tem uma resposta aqui:

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

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

print(characters)
Não percebo o que está a fazer, o descanso parece muito simples.

 57
Author: vaultah, 2010-01-15

5 answers

A get método de um dict (como, por exemplo, characters) funciona exatamente como a indexação do dict, exceto que, se a chave estiver em falta, em vez de levantar um KeyError devolve o valor padrão (se você chamar .get com apenas um argumento, a chave, o valor padrão é None).

Então uma função Python equivalente (onde chamar myget(d, k, v) é como d.get(k, v) pode ser:

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

O código da amostra na sua pergunta está claramente a tentar contar o número de ocorrências de cada carácter: se já tem uma contagem para um dado carácter, get devolve-o (por isso é apenas aumentado por um), caso contrário get devolve 0 (por isso o aumento dá 1 correctamente na primeira ocorrência de um carácter no texto).

 71
Author: Alex Martelli, 2018-02-21 15:38:15

Para entender o que está acontecendo, vamos pegar uma letra(repetida mais de uma vez) na frase e seguir o que acontece quando ela passa pelo laço.

Lembre-se que começamos com um dicionário de caracteres vazios

characters = {}
Eu escolho a letra "e". Vamos passar o personagem ' e '(encontrado na palavra O) pela primeira vez através do loop. Vou assumir que é a primeira personagem a passar pelo loop e vou substituir o variáveis com os seus valores:
for 'e' in "The quick brown fox jumped over the lazy dog.":
    {}['e'] = {}.get('e', 0) + 1 

Personagens.o get ('e', 0) diz ao python para procurar a chave 'e' no dicionário. Se não for encontrado, devolve 0. Dado que esta é a primeira vez que' e 'é passado através do loop, o carácter' e ' ainda não se encontra no dicionário, por isso o método get devolve 0. Este valor 0 é então acrescentado ao 1 (presente nos caracteres [ carácter] = caracteres.get (carácter,0) + 1 equação). Após a conclusão do primeiro ciclo usando o carácter' e', temos agora uma entrada no dicionário como esta: {'e': 1}

O dicionário é agora:

characters = {'e': 1}
Agora, vamos passar o segundo " e " (encontrado na palavra saltou) através do mesmo laço. Vou assumir que é o segundo personagem a passar pelo loop e vou actualizar as variáveis com os seus novos valores:
for 'e' in "The quick brown fox jumped over the lazy dog.":
    {'e': 1}['e'] = {'e': 1}.get('e', 0) + 1

Aqui o método get encontra uma entrada de chave para ' e ' e encontra o seu valor que é 1. Acrescentamos isto ao outro.1 em caracter.get (carácter, 0) + 1 e obter 2 como resultado.

Quando aplicamos isto nos caracteres [ carácter] = caracteres.obter (carácter, 0) + 1 equação:

characters['e'] = 2

Deve ficar claro que a última equação atribui um novo valor 2 à chave 'e' já presente. Portanto, o dicionário é agora:

characters = {'e': 2}
 18
Author: zeyad elharabi, 2013-12-02 11:13:29

Começa aqui http://docs.python.org/tutorial/datastructures.html#dictionaries

Depois aqui http://docs.python.org/library/stdtypes.html#mapping-types-dict

Depois aqui http://docs.python.org/library/stdtypes.html#dict.get

characters.get( key, default )

key is a character

default is 0

Se o carácter estiver no dicionário, characters, Você obtém o objecto do dicionário.

Se não, recebes 0.


Sintaxe:

get(key[, default])

Devolve o valor da chave se a chave está no dicionário, então o padrão. Se o valor por omissão não for indicado, o valor por omissão é None, de modo que este método nunca levante um KeyError.

 9
Author: S.Lott, 2015-05-03 13:11:31

Se d é um dicionário, então {[[0]} significa, me dê o valor de k Em d, A menos que k não esteja lá, nesse caso me dê v. está sendo usado aqui para obter a contagem atual do personagem, que deve começar em 0 se o personagem não foi encontrado antes.

 6
Author: Ned Batchelder, 2010-01-14 23:52:32
Vejo que esta é uma pergunta bastante antiga, mas parece uma daquelas alturas em que algo foi escrito sem o conhecimento de uma característica linguística. A biblioteca collections existe para cumprir estes 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})

Neste exemplo, os espaços estão a ser contados, obviamente, mas se quer ou não os filtrados depende de si.

Quanto ao dict.get(a_key, default_value), houve várias respostas para esta questão em particular -- este método devolve o valor da chave, ou o valor default_ value tu forneces. O primeiro argumento é a chave que você está procurando, o segundo argumento é o padrão para quando essa chave não está presente.

 2
Author: , 2014-01-27 16:35:49