Modulo 016 – List Comprehension

– 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.

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