Article image
Michel Souza
Michel Souza11/01/2024 11:00
Compartilhe

Compreensão de Listas, com Exemplos de Funções em Python

  • #Python

Salve família DIO!!!!!

Muito do que utilizamos em Python pode ser reproduzido de maneira parecida em outras linguagens. Porém, um dos objetivos da linguagem é realizar o máximo possível de trabalho com a menor quantidade possível de código, resultando em um código mais limpo e com menos efeitos colaterais.

Partindo disso, vamos abordar uma maneira diferente e mais enxuta para resolver problemas, utilizando funções e a ferramenta compreensão de listas, através de exemplos.

Desvendando a Sintaxe

Para iniciar, vamos criar uma lista de quadrados dos números 1 a 10, utilizando laço for:

quadrados = []
for x in range(1,11):
  quadrados.append(x**2)

print(quadrados)

Saída:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Observe que utilizamos 3 linhas de código para criar uma lista, além disso foi criada uma variável auxiliar "x" que segue sendo alocada, após o laço de repetição ser finalizado.

Agora, vamos trazer a mesma solução, aplicando a aplicação de listas:

quadrados = [n**2 for n in range(1,11)]
print(quadrados)

Saída:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Desta forma, podemos calcular a lista de quadrados, de forma mais concisa, fácil de ler e sem variáveis sobrando após execução.

Definição

Segundo O Tutorial do Python, Compreensões de lista fornece uma maneira concisa de criar uma lista. Aplicações comuns são criar novas listas onde cada elemento é o resultado de alguma operação aplicada a cada elemento de outra sequência ou iterável, ou criar uma subsequência de elementos que satisfaçam uma certa condição.

De uma forma geral, para criar uma lista através de compreensão, utilizamos a seguinte sintaxe:

nova_lista = [expressao for item in iteravel]

Um par de colchetes, contendo uma expressão seguida de uma cláusula for. Partindo dessa construção inicial, vamos apresentar variações com mais recursos.

Compreensão com Múltiplos Laços

No próximo exemplo, vamos construir uma combinação entre duas listas.

lista_1 = [1,2,3]	
lista_2 = [3,1,4]

Aplicando apenas laços for (verificar artigo sobre este laço):

combs = []
for x in lista_1:
for y in lista_2:
  combs.append((x, y))
print(combs)

Saída:

[(1, 3), (1, 1), (1, 4), (2, 3), (2, 1), (2, 4), (3, 3), (3, 1), (3, 4)]

Agora, aplicando compreensão:

combs = [(x, y) for x in lista_1 for y in lista_2]
print(combs)

Saída:

[(1, 3), (1, 1), (1, 4), (2, 3), (2, 1), (2, 4), (3, 3), (3, 1), (3, 4)]

Observe que o código é mais legível e com menos linhas para trazer a mesma solução. Além disso, note que esta é uma variação da construção inicial:

nova_lista = [expressao for item1 in iteravel1 for item2 in iteravel2]

Vamos explorar outra forma de compreensão de listas, agora aplicando também o laço condicional. 

Compreensão com Condicional

No exemplo, vamos criar a lista de combinações, apenas com itens diferentes entre as listas 1 e 2.

Utilizando apenas laços for e if:

combs = []
for x in lista_1:
for y in lista_2:
  if x != y:
    combs.append((x, y))
print(combs)

Saída:

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Utilizando compreensão:

combs = [(x, y) for x in lista_1 for y in lista_2 if x != y]
print(combs)

Saída:

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

Note como a ordem das instruções for e if é a mesma em ambos os trechos, apresentado mais uma forma de desenvolvimento:

nova_lista = [expressao for item in iteravel if condicao]

Observe também que nos exemplos de combinações, a expressão está entre parênteses, pois o resultado é uma estrutura de dados do tipo tupla (ver documentação).

Filtro com Compreensão de Listas

Uma aplicação comum em compreensão de listas, trabalhando com condicionais, é a geração de filtros.

No exemplo abaixo, estão sendo filtradas apenas as vogais da frase:

frase = 'Estudar Python, gostoso demais!'
vogais = [i for i in frase if i in 'aeiouAEIOU']
print(vogais)

Saída:

['E', 'u', 'a', 'o', 'o', 'o', 'o', 'e', 'a', 'i']

Compreensões de Listas Aninhadas

Segundo a documentação do Python, a expressão inicial em uma compreensão de lista pode ser qualquer expressão arbitrária, incluindo outra compreensão de lista.

Desta forma, podemos aplicar esta ideia para aplicação de soluções em matrizes.

O exemplo abaixo lê pelo teclado a quantidade de vitórias, empates e derrotas para cada time em um grupo:

times = ['Sport Club Python', 'JavaScript Santista', 'C Old Boys', 'Javeiros SA']
entradas = ['V', 'E', 'D']

tabela = [[int(input(f'Digite a quantidade de {tipo} do time {time}: ')) for tipo in entradas] for time in times]
print(tabela)

Funções com Compreensões Implementadas

A seguir, vamos apresentar alguns exemplos de soluções de problemas, aplicando necessariamente compreensão de listas. Deixo como sugestão realização de testes com os códigos descritos, na plataforma Google Colab ou IDE de sua preferência.

Exemplo 1:

Um professor precisou anular uma questão de uma prova. Para solucionar o problema, ele escreveu uma função que recebe a lista de notas da turma, o valor da questão e soma esse valor em todas as notas.

def correcao(notas,valor):
 return [x+valor for x in notas]

entrada1 = [8,7,6,4,5,4]
entrada2 = 0.5
resultado = correcao(entrada1,entrada2)
print(resultado)

Exemplo 2:

Função que recebe uma lista de números e retorna uma lista contendo os cubos dos números pares.

def cubos(lista):
 return [x**3 for x in lista if x%2 == 0]

entrada = list(range(21))
resultado = cubos(entrada)
print(resultado)

Exemplo 3:

Função que recebe uma lista de números e retorna uma lista contendo os cubos dos números positivos e o quadrado dos números negativos.

def manipulaLista(lista):
 return [x**3 if x >= 0 else x**2 for x in lista]

entrada = list(range(-10,11))
resultado = manipulaLista(entrada)
print(resultado)

Exemplo 4:

Função que retorna uma lista contendo apenas float a partir de uma lista contendo variáveis inteiras, float e strings.

def flutuantes(lista):
 return [float(x) for x in lista]

entrada = [1, 2.0, '3', 4.0, '5.5', 6]
resultado = flutuantes(entrada)
print(resultado)

Exemplo 5:

Função que retorna uma lista contendo apenas números a partir de uma lista contendo variáveis inteiras, float e strings. Valores já numéricos NÃO devem ter seu tipo alterado, apenas strings.

def numericos(lista):
 return [x if type(x) != str else float(x) for x in lista]

entrada = [1, 2.0, '3', 4.0, '5.5', 6]
resultado = numericos(entrada)
print(resultado)

Exemplo 6:

Função que recebe uma lista de nomes, uma lista de médias e a nota mínima para aprovação. Ela deverá retornar uma lista com os nomes dos alunos reprovados.

def aprovados(nomes,medias,notaMin):
 return [[nome,media] for nome,media in zip(nomes,medias) if media >= notaMin ]

listaNomes = ['Marcos','Lucas','Alfredo','Fernando']
listaNotas = [8,3,4,7.5]
n = 7
print(aprovados(listaNomes,listaNotas,n))

Exemplo 7:

Função que recebe uma lista de nomes, uma lista de médias e a nota mínima para aprovação. Ela deverá retornar uma lista com os nomes dos alunos reprovados.

def aprovados(nomes,medias,notaMin):
 return [[nome,media] for nome,media in zip(nomes,medias) if media >= notaMin ]

listaNomes = ['Marcos','Lucas','Alfredo','Fernando']
listaNotas = [8,3,4,7.5]
n = 7
print(aprovados(listaNomes,listaNotas,n))

Observação: Nos dois últimos exemplos, utilizamos a função zip. Deixo como sugestão verificar um artigo sobre esta função (ver artigo).

Conclusão

Temos uma infinidade de aplicações e oportunidades de uso com compreensão de listas com Python. Além disso, da mesma forma que utilizamos compreensão para lista, existe a compreensão de dicionários, objeto de um possível novo artigo.

Verifiquem a documentação oficial, para mais exemplos e definições, no item 5.1.3: https://docs.python.org/pt-br/3/tutorial/datastructures.html

Referências

[1] https://docs.python.org/pt-br/3/tutorial/datastructures.html

[2] https://realpython.com/lessons/list-comprehensions-overview/

[3] https://realpython.com/list-comprehension-python/

[4] https://www.dio.me/articles/como-usar-for-em-python

Compartilhe
Comentários (0)