Compreensão de Lista (List Comprehension) - Python
A funcionalidade de compreensão de lista oferece uma forma mais concisa e direta para criar listas a partir de outros conjuntos de dados. Ela segue a seguinte estrutura:
newlist = [expression for item in iterable (if condition)]
A estrutura de compreensão de lista é composta pelos seguintes elementos:
: uma fonte de dados iterável, que pode ser uma lista, conjunto, sequência ou até uma função que retorna dados, comoiterable
.range()
: o elemento extraído da fonte de dados.item
: uma expressão que retorna um valor, que será inserido na lista resultante.expression
: um critério opcional que define quais elementos da fonte de dados serão incluídos na lista. Se o elemento não atender à condição, ele não será selecionado.condition
Agora consideramos alguns exemplos.
Suponha que precisemos selecionar todos os números maiores que 0 em uma lista. Tradicionalmente, o código seria escrito assim:
numbers = [-3, -2, -1, 0, 1, 2, 3]
positive_numbers = []
for n in numbers:
if n > 0:
positive_numbers.append(n)
print(positive_numbers) # [1, 2, 3]
Usando list comprehension, o código pode ser simplificado:
numbers = [-3, -2, -1, 0, 1, 2, 3]
positive_numbers = [n for n in numbers if n > 0]
print(positive_numbers) # [1, 2, 3]
A expressão [n for n in numbers if n > 0]
n
numbers
n
Fonte de Dados iterable
A fonte de dados iterable
range()
numbers = [n for n in range(10)]
print(numbers) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Podemos também usar essa construção para criar listas a partir de dicionários, como neste exemplo que seleciona todas as chaves:
dictionary = {"red": "vermelho", "blue": "azul", "green": "verde"}
words = [word for word in dictionary]
print(words) # ['red', 'blue', 'green']
Retornando Resultados
O parâmetro expression
expression
numbers = [-3, -2, -1, 0, 1, 2, 3]
new_numbers = [n for n in numbers]
print(new_numbers) # [-3, -2, -1, 0, 1, 2, 3]
No entanto, podemos aplicar qualquer operação ou função ao elemento extraído. Por exemplo, para retornar o dobro de cada número:
numbers = [1, 2, 3, 4, 5]
doubled_numbers = [n * 2 for n in numbers]
print(doubled_numbers) # [2, 4, 6, 8, 10]
Ou até mesmo expressões mais sofisticadas:
numbers = [-3, -2, -1, 0, 1, 2, 3]
new_numbers = [n * 2 if n > 0 else n for n in numbers]
print(new_numbers) # [-3, -2, -1, 0, 2, 4, 6]
Nesse caso, a expressão é n * 2 if n > 0 else n
n * 2
n
n
É possível fazer diversas transformações nas expressões. Por exemplo, podemos retornar valores de um dicionário com base em suas chaves:
dictionary = {"red": "vermelho", "blue": "azul", "green": "verde"}
words = [f"{key}: {dictionary[key]}" for key in dictionary]
print(words) # ['red: vermelho', 'blue: azul', 'green: verde']
Condição
O parâmetro condition
numbers = [n for n in range(10) if n % 2 == 0]
print(numbers) # [0, 2, 4, 6, 8]
Ou para selecionar apenas as chaves de um dicionário com mais de 3 caracteres:
dictionary = {"red": "vermelho", "blue": "azul", "green": "verde"}
words = [f"{key}: {dictionary[key]}" for key in dictionary if len(key) > 3]
print(words) # ['blue: azul', 'green: verde']