Fala grande Dev!
Dict Comprehensions é uma ferramenta muito útil e poderosa do Python para manipulação de dicionários (dicts)! Com essa técnica, podemos tratar dicionários de uma maneira rápida e concisa!
Essa técnica segue o mesmo conceito das mais conhecidas List Comprehensions!
Ainda não sabe manusear listas usando List Comprehensions?
Então P-A-R-A tudo e vai lá no post sobre List Comprehensions. Fico te aguardando voltar!
… Tô esperando …
Pronto! Agora podemos continuar!
Vá Direto ao Assunto…
- O início de tudo: o
dict
- Dict Comprehensions
- Dict Comprehensions com if
- Dict Comprehensions com vários if
O início de tudo: o dict
Antes de tudo, vamos falar rapidamente sobre o tipo de dado dict
. (Se você já sabe, pode pular essa seção )
Dicionário em Python é uma coleção de dados sem ordem onde cada elemento possui um par chave/valor.
E o que é um par chave/valor?
Basicamente é uma forma de se indexar um valor a partir de uma chave.
Isso dá acesso eficiente (pros puristas, temos O(1) aqui!) aos valores da estrutura de dados.
A sintaxe para criar dicionários é a seguinte:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Dicionário vazio
dicionario = {}
# Dicionário comum
dicionario = {'jedi': 10, 'sith': 7}
# Dicionário com chaves inteiras
dicionario = {1: 'Baby Yoda', 2: 'Yoda'}
# Dicionário misturado
dicionario = {'especie': 'Humano', 1: ['Obi Wan Kenobi', 'Qui-Gon Jinn']}
# Outra forma de criação, usando dict()
dicionario = dict({'jedi': 10, 'sith': 7})
Já para acessar elementos:
1
2
3
4
5
6
7
8
9
10
11
12
13
dicionario = {'nome': 'Vinícius Ramos', 'idade': 29}
# Saída: Vinícius
print(dicionario['nome'])
# Saída: 29
print(dicionario.get('idade'))
# Caso não encontre, devolva o valor None
print(dicionario.get('altura', None))
# Será lançada uma exceção KeyError
print(dicionario['endereco'])
Para atualizar valores:
1
2
3
4
5
dicionario = {'nome': 'Vinícius Ramos', 'idade': 29, 'empresa': 'PythonAcademy'}
# Atualiza dados
dicionario['idade'] = 30
dicionario['empresa'] = 'PythonAcademy Inc.'
Para remover elementos:
1
2
3
4
5
6
7
8
9
10
11
12
13
dicionario = {'nome': 'Vinícius Ramos', 'idade': 29, 'empresa': 'PythonAcademy'}
# Remove a chave/valor 'idade': 29
dicionario.pop('idade')
# Remove um par aleatório
dicionario.popitem()
# Remove todos os itens
dicionario.clear()
# Deleta 'empresa'
del dicionario['empresa']
Pronto! Você agora é um expert em Dicionários!
Agora vamos pro prato principal: Dict Comprehension!
Antes que eu me esqueça! Se não é inscrito no canal, curta, dê um jóinh…..
Ops! Canal errado!
Está curtindo esse conteúdo?
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Dict Comprehensions
Dict Comprehensions foram introduzidas na linguagem através da especificação PEP 274.
Sua sintaxe básica é:
1
{chave: valor for elemento in iteravel}
Agora respira que vamos entender cada ponto:
-
chave
: será a chave de cada elemento do dicionário resultante. -
valor
: valor daquela chave. -
elemento
: é a unidade de iteração do iteráveliterável
(se for uma lista, por exemplo,elemento
irá receber o valor iteração à iteração) -
iteravel
: conjunto de dados que estão sendo iterados (pode ser uma lista ou umset
, por exemplo)
Pra esclarecer, vamos à um exemplo:
1
dicionario = {elemento: elemento*2 for elemento in range(6)}
Aqui, cada elemento da lista resultante de range(6)
(0, 1, 2, 3, 4, 5) será convertido em:
- Uma chave com o mesmo valor do
elemento
da lista. -
elemento*2
é o valor de cada chave (multiplicar por 2 cada elemento).
O resultado será:
1
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
Outro exemplo, com chaves alfabéticas e manipulação de strings com f-strings:
1
2
3
4
lista = ['Ferrari', 'Lamborghini', 'Porsche']
dicionario = {
f'{elemento.lower()}': f'Montadora: {elemento.upper()}' for elemento in lista
}
Resultando em:
1
2
3
4
5
{
'ferrari': 'Montadora: FERRARI',
'lamborghini': 'Montadora: LAMBORGHINI',
'porsche': 'Montadora: PORSCHE'
}
Também é possível iterar sobre um outro dicionário através do método items()
.
Ele retorna a chave e o valor de cada elemento do dicionário de entrada.
Veja um exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import locale
# Configura o locale pra Português do Brasil (pt_BR)
locale.setlocale(locale.LC_MONETARY, 'pt_BR.utf8')
carros_esportivos = {
'ferrari': 1299000,
'lamborghini': 1100000,
'porsche': 759000
}
dict_saida = {
chave: f'{chave.upper()}: {locale.currency(valor)}' for chave, valor in carros_esportivos.items()
}
Essa seria a saída:
1
2
3
4
5
{
'ferrari': 'FERRARI: R$ 1299000,00',
'lamborghini': 'LAMBORGHINI: R$ 1100000,00',
'porsche': 'PORSCHE: R$ 759000,00'
}
Legal não é mesmo?!
Assim como acontece em List Comprehensions, também podemos adicionar lógica condicional (if
/else
).
Dict Comprehensions com if
Podemos adicionar lógica condicional à construção do dicionário resultante do nosso Dict Comprehension.
Podemos adicionar uma expressão condicional em três posições distintas:
Na construção da chave. Sintaxe:
1
{chave if condicao: valor for elemento in iteravel}
Na expressão que definirá o valor da chave:
1
{chave: valor if condicao for elemento in iteravel}
Ao final da expressão, filtrando os dados do iterável:
1
{chave: expressao for elemento in iteravel if condicao}
Podendo ser um mix da primeira versão, segunda ou terceira (Aí o bagulho fica lôco!).
Por exemplo, se quisermos filtrar o dicionário de carros esportivos acima, pegando apenas aqueles com valor superior à R$ 1.000.000,00?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import locale
# Configura o locale pra Português do Brasil (pt_BR)
locale.setlocale(locale.LC_MONETARY, 'pt_BR.utf8')
carros_esportivos = {
'ferrari': 1299000,
'lamborghini': 1100000,
'porsche': 759000
}
dict_saida = {
chave: f'{chave.upper()}: {locale.currency(valor)}'
for chave, valor in carros_esportivos.items() if valor > 1000000
}
Resultaria em:
1
2
3
4
{
'ferrari': 'FERRARI: R$ 1299000,00',
'lamborghini': 'LAMBORGHINI: R$ 1100000,00'
}
Dict Comprehensions com vários if
E se quisermos alterar a chave e o valor na mesma expressão?
Podemos fazer da seguinte forma:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import locale
# Configura o locale pra Português do Brasil (pt_BR)
locale.setlocale(locale.LC_MONETARY, 'pt_BR.utf8')
carros_esportivos = {
'ferrari': 1299000,
'lamborghini': 1100000,
'porsche': 759000
}
dict_saida = {
chave if valor > 1000000 else f'{chave}-valor-abaixo':
f'{chave.upper()}: {locale.currency(valor)}'
if valor > 1000000 else f'{chave.upper()}: Valor abaixo de R$ 1.000.000,00'
for chave, valor in carros_esportivos.items()
}
Nesse exemplo:
- Chave será
f'{chave}-valor-abaixo'
casovalor
seja menor que 1000000. - Valor será
f'{chave.upper()}: Valor abaixo de R$ 1.000.000,00'
casovalor
seja menor que 1000000.
O resultado seria:
1
2
3
4
5
{
'ferrari': 'FERRARI: R$ 1299000,00',
'lamborghini': 'LAMBORGHINI: R$ 1100000,00',
'porsche-valor-abaixo': 'Valor abaixo de R$ 1.000.000,00'
}
Contudo, aqui vai uma dica.
Percebeu o quão “embolado” ficou o código?
Não é por que o Python possibilite isso, que seja uma boa ideia utilizá-lo dessa forma.
Nunca se esquecam do primeiro Zen do Python: “Bonito é melhor que feio”.
Ainda não conhece o explicativo do “Zen do Python” da Python Academy?
Conheça o Zen of Python clicando aqui) e se possível, o tatue no braço.
Brincadeira, só tatuá-lo já serve!
Conclusão
Nesse post vimos como podemos usar dict comprehensions para criar e manipular dicts de uma maneira poderosa e eficiente.
Vimos quão eficiente essa técnica pode ser e as diversas formas de utilizá-la.
Agora que você está craque em Dict Comprehensions, que tal começar a utilizá-lo?
Então… Mão na massa!
Até o próximo post!