– List Comprehension – O que é List Comprehension
O que você aprenderá nesse módulo não é algo OBRIGATÓRIO. Esse módulo tem por objetivo apresentar práticas comuns na construção de códigos em Python. No início, mais importante que escrever seus códigos usando o List Comprehension é saber entender um código que esteja escrito dessa forma.
Por que?
Boa parte do desafio em se programar, seja em Python ou qualquer outra linguagem é saber:
• O que pesquisar;
• Como pesquisar;
• Entender o que se achou;
• Adequar o que já existe para seu projeto.
É muito comum que programadores mais antigos se usem desses artifícios para que seu código fique mais elegante. Por isso é muito importante entender o que são e quais são os “pulos” de código que são usados no mercado.
Por que?
Boa parte do desafio em se programar, seja em Python ou qualquer outra linguagem é saber:
• O que pesquisar;
• Como pesquisar;
• Entender o que se achou;
• Adequar o que já existe para seu projeto.
É muito comum que programadores mais antigos se usem desses artifícios para que seu código fique mais elegante. Por isso é muito importante entender o que são e quais são os “pulos” de código que são usados no mercado.
Vamos para um caso que queremos calcular os impostos de produtos distintos. O imposto é fixado em 30% do valor do produto. O que faremos aqui é apresentar 2 soluções distintas que estão CORRETAS, mas escritas de forma distintas. A primeira utiliza a lógica que temos usado até aqui (TRADICIONAL), já a segunda, usa o conceito de list comprehension. Abaixo temos as duas formas de se resolver esse problema.
preco_produtos = [100, 150, 300, 5500]
produtos = ['vinho', 'cafeiteira', 'microondas', 'iphone']
“Tradicional” (Usando um for)
impostos = []
for item in preco_produtos:
impostos.append(item * 0.3)
print(impostos)
________________
[30.0, 45.0, 90.0, 1650.0]
List Comprehension
impostos = [preco * 0.3 for preco in preco_produtos]
print(impostos)
_______________________
[30.0, 45.0, 90.0, 1650.0]
Você é capaz de entender o que está sendo feito no list comprehension comparando os dois códigos? Achou estranho? Fique tranquilo, não é trivial no início. Vamos entender melhor. Essencialmente o que ocorre aqui é:
• Na primeira solução (“Tradicional”):
Criamos uma variável item que percorre a lista preço_produtos, que explicitamente adiciona(.append) o valor calculado na lista impostos.
• Na segunda solução :
O método .append não é explícito. A leitura da linha de código seria: “para cada preço da lista preco_produtos será calculado um item da lista imposto. Esse valor será calculado por preço * 0.3”
– Exemplo de List Comprehension
Vamos para outro exemplo. Aqui, temos 2 listas separadas mas que se relacionam entre si. Sabemos que se por exemplo ordernarmos a lista de vendas_produtos do maior para o menor nada acontecerá na nossa lista produtos.
Ou seja, as posições que antes estavam “casadas” agora estão distintas. Antes de qualquer tratamento, precisamos UNIR essas duas listas. Uma boa forma é transformar essas duas listas em uma única lista de tuplas.
Para isso, usaremos a função ZIP() que já vimos anteriormente no módulo de dicionários. Possuindo a lista de tuplas é só aplicarmos o unpacking usando o List Comprehension como apresentado na figura ao lado
vendas_produtos = [1500, 150, 2100, 1950]
produtos = ['vinho', 'cafeiteira', 'microondas', 'iphone']
lista_aux = list(zip(vendas_produtos, produtos))
lista_aux.sort(reverse=True)
produtos = [produto for vendas, produto in lista_aux]
print(produtos)
_____________________
['microondas', 'iphone', 'vinho', 'cafeiteira']
List comprehension que pode ser lida como: “para cada item venda e produto da lista_aux, será criado um item produto na lista produtos”
– List Comprehension filtrando com if
Mais um caso onde o list comprehension nos auxilia a reduzir as linhas de código. Este caso é ainda menos intuitivo, principalmente no início da jornada na programação .
LEMBRANDO, nada disso é obrigatório, são formas distintas de se escrever onde o resultado final é o mesmo.
meta = 1000
vendas_produtos = [1500, 150, 2100, 1950]
produtos = ['vinho', 'cafeiteira', 'microondas', 'iphone']
produtos_acima_meta = [produto for i, produto in enumerate(produtos) if vendas_produtos[i] > meta]
print(produtos_acima_meta)
______________________
['vinho', 'microondas', 'iphone']
– Tratando casos em List Comprehension
Mais um caso onde o list comprehension nos auxilia a reduzir as linhas de código.
Nesse caso, vamos usar as estruturas de IF/ELSE para criar uma lista de vendedores que bateram uma meta pré-definida.
LEMBRANDO, nada disso é obrigatório, são formas distintas de se escrever onde o resultado final é o mesmo.
vendedores_dic = {'Maria': 1200, 'José': 300, 'Antônio': 800, 'João': 1500, 'Francisco': 1900, 'Ana': 2750, 'Luiz': 400, 'Paulo': 20, 'Carlos': 23, 'Manoel': 70, 'Pedro': 90, 'Francisca': 80, 'Marcos': 1100, 'Raimundo': 999, 'Sebastião': 900, 'Antônia': 880, 'Marcelo': 870, 'Jorge': 50, 'Márcia': 1111, 'Geraldo': 120, 'Adriana': 300, 'Sandra': 450, 'Luis': 800}
meta = 1000
bonus = [vendedores_dic[item] * 0.1 if vendedores_dic[item] > meta else 0 for item in vendedores_dic]
print(bonus)
________________________
[120.0, 0, 0, 150.0, 190.0, 275.0, 0, 0, 0, 0, 0, 0, 110.0, 0, 0, 0, 0, 0, 111.10000000000001, 0, 0, 0, 0]
– List Comprehension não serve apenas para criar listas
Mais um caso onde o list comprehension nos auxilia a reduzir as linhas de código.
Nesse caso não vamos criar uma lista, mas sim retornar um valor da soma das vendas dos produtos listados como “TOP5”.
LEMBRANDO, nada disso é obrigatório, são formas distintas de se escrever onde o resultado final é o mesmo.
produtos = ['coca', 'pepsi', 'guarana', 'skol', 'brahma', 'agua', 'del valle', 'dolly', 'red bull', 'cachaça', 'vinho tinto', 'vodka', 'vinho branco', 'tequila', 'champagne', 'gin', 'guaracamp', 'matte', 'leite de castanha', 'leite', 'jurupinga', 'sprite','fanta']
vendas = [1200, 300, 800, 1500, 1900, 2750, 400, 20, 23, 70, 90, 80, 1100, 999, 900, 880, 870, 50, 1111, 120, 300, 450, 800]
top5 = ['agua', 'brahma', 'skol', 'coca', 'leite de castanha']
total_top5 = sum(vendas[i] for i, produto in enumerate(produtos) if produto in top5)
print(total_top5)
print('Top 5 representou {:0.1%} das vendas'.format(total_top5/sum(vendas)))
__________________________
8461
Top 5 representou 50.6% das vendas
Nenhum comentário:
Postar um comentário