Compreensão de listas no Python

Em um sistema de cadastro de produtos que estou desenvolvendo em Python, para um mercado,temos a seguinte classe que representa um produto:


class Produto(object): 
  def __init__(self, nome, valor, quantidade):
   self.__nome = nome 
   self.__valor = valor 
   self.__quantidade = quantidade

  def __repr__(self):
   return self.__nome

  def get_nome(self): 
    return self.__nome

  def get_valor(self):
   return self.__valor

  def get_quantidade(self):
   return self.__quantidade

  def impressao(self): 
    return "nome:%s valor:%s quantidade:%s" % (self.__nome, self.__valor, self.__quantidade)

Dentro desse sistema, recebi uma lista chamada produtos:


produtos = produtos_em_estoque()

Contendo os seguintes produtos:

 nome:Arroz valor:10.5 quantidade:100 nome:Feijao valor:6.5 quantidade:80 nome:Refrigerante valor:3.0 quantidade:120 nome:Cafe valor:5.45 quantidade:75 nome:Sabao em po valor:8.75 quantidade:80 nome:Requeijao valor:3.5 quantidade:76 nome:Leite valor:2.5 quantidade:132 nome:pao de forma valor:2.0 quantidade:120 nome:Cafe valor:5.45 quantidade:75 nome:caixa de bombom valor:6.75 quantidade:93

Porém, o dono do mercado pediu para verificar todos os produtos que estão acabando, ou seja, com quantidade menores que 100. Uma solução procedural para esse problema seria criar um for, e então, dentro dele, adicionamos um if que verifica os produtos com quantidades menores que 100 e, se for verdade, adicionamos a uma nova lista contendo todos os produtos que estão acabando. Por fim, devolvemos essa nova lista:


poucas_qtd =  for produto in produtos: if(produto.get_quantidade() < 100): poucas_qtd.append(produto)

print poucas_qtd

O resultado seria:

 [Feijao, Cafe, Sabao em po, Requeijao, Cafe, caixa de bombom]

Para uma tarefa bem simples, escrevemos muito código... Em outras palavras, escrevemos 3 linhas de código para resolver um problema bem comum em uma lista! Será que tem como resolver isso de uma forma mais enxuta e objetiva?

No Python, além dos recursos básicos que encontramos em muitas linguagens de programação,isto é, instruções de for, if e else entre outras. Temos também um recurso bem interessante chamado compreensão de lista, que nos ajuda, e muito, na manipulação de dados de uma lista. Por exemplo, para resolver o mesmo problema que acabamos de ver utilizando a compreensão de lista, faríamos da seguinte forma:


poucas_qtd = [produto for produto in produtos if produto.get_quantidade() < 100] 
print poucas_qtd

Vejamos o resultado:

Feijao, Cafe, Sabao em po, Requeijao, Cafe, caixa de bombom

Exatamente o mesmo resultado! Porém, veja que resolvemos dessa vez em uma única linha! E mais, sem a necessidade de criar uma lista vazia! Mas como isso aconteceu?

A compreensão de lista, itera sobre todos os elementos de uma lista e executa uma ação para cada item encontrado de acordo com o filtro que utilizamos. Em outras palavras, é descrita com a seguinte estrutura:

ação a ser tomada, itens iterados, filtro

  • ação a ser tomada: Ação desejada para cada item. (Nesse exemplo só devolvemos o item).
  • itens iterados: lista que queremos iterar e extrair seus itens.
  • filtro: Onde aplicamos as condições para devolver os itens de uma lista.

Suponhamos que dessa vez, o dono desse mercado pediu para verificar todos os produtos com valores abaixo de R\$ 10,00, e então, para cada um desses produtos, acrescentar 10% ao valor original. Como faríamos isso? Será que apenas em modo procedural da certo? Para a nossa felicidade, por meio da compreensão de lista, podemos também realizar operações aritméticas! Vejamos como ficaria:


produto.acrescentar_valor(produto.get_valor() * 0.10) 
  for produto in produtos if produto.get_valor() < 10

Se imprimirmos os nosso produtos:


for produto in produtos: print produto.impressao()

Temos o seguinte resultado:

 nome:Arroz valor:10.5 quantidade:100 nome:Feijao valor:7.15 quantidade:80 nome:Refrigerante valor:3.3 quantidade:120 nome:Cafe valor:5.995 quantidade:75 nome:Sabao em po valor:9.625 quantidade:80 nome:Requeijao valor:3.85 quantidade:76 nome:Leite valor:2.75 quantidade:132 nome:pao de forma valor:2.2 quantidade:120 nome:Cafe valor:5.995 quantidade:75 nome:caixa de bombom valor:7.425 quantidade:93

Como podemos ver, os produtos: "Feijao, Refrigerante, Cafe, Sabao em po, Requeijao, Leite, pao de forma, Cafe e caixa de bombom". Sofreram o acrescimento de 10% com um código de apenas 1 linha!

E aí, gostou da compreensão de lista? Que tal tentar agora mesmo substituir os seus fors e ifs por ela? Quer aprender mais sobre os recursos do python? Então de uma olhada nos nossos cursos online de python na Alura.

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor com foco em Java, Kotlin, Android e Spring. É expert em Programação Orientada a Objetos, visando sempre compartilhar as melhores práticas e tendências do mercado para desenvolvimento de software com quem está estudando o assunto. Atuou 2 anos como editor de conteúdo no blog da Alura e hoje ainda escreve artigos técnicos sobre o desenvolvimento.

Leia também:

Veja outros artigos sobre Programação