Compreensão de listas no Python

(Last Updated On: 28 de dezembro de 2016)

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.

FIQUE POR DENTRO

Content Editor at Alura and Software Developer

Próximo ArtigoAlura entrevista: Julius Lima, criador do Wingbirds