Compreensao.método get () em Python [duplicado]
esta pergunta já tem uma resposta aqui:
- porquê dict.obter (chave) em vez de dict[chave]? 8 respostas
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.
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).
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}
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 umKeyError
.
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.
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.