Compreensão em listas, Conjuntos e Dicionários
Compreensões em listas (list comprehension), conjuntos (set comprehension) e dicionários(dictionary comprehension) são recursos do Python que permitem criar essas estruturas de forma concisa, elegante e muitas vezes mais eficiente do que usando loops tradicionais. Esses recursos seguem o mesmo princípio, mas adaptados ao tipo de estrutura.
Compreensão de listas
A compreensão de listas (list comprehension) cria uma nova lista ao processar elementos de um iterável (como outra lista, tupla ou intervalo) de forma concisa.
Sintaxe (onde a nova_expressão é o novo valor que está sendo avaliada e adicionada à nova lista.)
[nova_expressão for item in iterável if condição]
| Comparativo Listas
palavra = "Teste"
lista_palavra = []
for p in palavra:
lista_palavra.append(f"{p}!")
print(lista_palavra)
# Código com compreensão em lista
palavra = "Teste"
lista = [(p+'!') for p in palavra]
print(lista) # Saída: ['T!', 'e!', 's!', 't!', 'e!']
# multiplica o resultado por 10 em cada iteração
lista = [(x*10) for x in range(10)]
# Saída: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# so adiciona números pares
lista3 = [x for x in range(10) if x % 2 == 0]
def ao_quadrado(num):
return num ** 2
# passando uma função para o resultado
lista = [ao_quadrado(i) for i in range(10) if i > 1]
print(lista)
É possivel passar uma função na expresão para cada item iterado.
cpfs = ['012.345.678-90', '098.765.432-10', '090.080.070-65', '111.222.333-45']
# Exemplo usando compreensão em lista e desempacotamento no print
print(*[f"Cpf: {cpf}" for cpf in cpfs], sep="\n")
# Exemplo usando compreensão em gerador e desempacotamento no print
print(*(f"Cpf: {cpf}" for cpf in cpfs), sep="\n")
# --- EXEMPLO DE CONSUMO DE MEMÓRIA --- #
import sys
cpfs = [str(i) for i in range(10_000)] # Lista com 10.000 CPFs
lista_comprehension = [f"Cpf: {cpf}" for cpf in cpfs]
generator_expression = (f"Cpf: {cpf}" for cpf in cpfs)
print("Tamanho da Lista:", sys.getsizeof(lista_comprehension)) # Consome mais memória
print("Tamanho do Generator:", sys.getsizeof(generator_expression)) # Muito menor
Diferenças da compreensão em lista[] e Generator Expression().
A lista inteira é criada antes de ser passada para print(). Isso consome mais memória, porque todos os elementos são armazenados na lista antes da impressão. Se cpfs tiver muitos elementos, pode ser menos eficiente.
No gerador, os valores são gerados sob demanda, um por um, sem armazenar todos na memória ao mesmo tempo. Isso economiza memória e melhora o desempenho para listas grandes.
Compreensão de Conjuntos
A compreensão de conjuntos (set comprehension) funciona de maneira semelhante à compreensão de listas, mas cria um conjunto, uma estrutura que não permite duplicatas.
Sintaxe
{nova_expressão for item in iterável if condição}
# tiro as letras 'E' da palavra teste e o t só se repete porque é case sensitive
conjunto_a = {(p+'!') for p in 'Teste' if p != 'e'}
print(conjunto_a) # resultado: {'s!', 't!', 'T!'}
Compreensão de Dicionários
A compreensão de dicionários (dictionary comprehension) cria um dicionário, especificando pares de chave:valor com base em um iterável.
Sintaxe
{nova_chave: novo_valor for item in iterável if condição} OU
{nova_chave: novo_valor for (chave,valor) in dict.items() if condição}
| Comparativo Dicionários
quadrados = {x: x**2 for x in range(1, 6)}
print(quadrados) # Saída: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
dicionario_frutas_em_dolar = {
'maça': 1.00,
'banana': 0.50,
'laranja': 0.25
}
fator_conversao = 5.00
frutas_em_real = {
# expressão
chave: valor * fator_conversao
# Desempacotando a chave e o valor
for chave, valor in dicionario_frutas_em_dolar.items()
}
print(frutas_em_real)