O que é Compreensão de Lista em Python
Compreensão de Lista (ou Abrangência de Lista)
Compreensão de Lista (list comprehension) é uma maneira elegante e concisa de criar e executar tarefas sobre listas em Python. Essa técnica permite que seja criada uma nova lista a partir de outra de uma forma bastante concisa e fácil de entender.
Neste tutorial mostro como usar Compreensões de Lista em Python.
Sintaxe
A sintaxe geral de uma Compreensão de Lista é:
[expressão for item in lista]
onde “expressão” é a expressão que será avaliada para cada elemento em “lista“, e “item” é a variável que representa cada elemento na lista.
Vejamos alguns exemplos.
Exemplo 01
# Criar uma lista de números pares de 0 a 10
pares = [num for num in range(11) if num % 2 == 0]
print(pares)
Resultado:
[0, 2, 4, 6, 8, 10]
Neste exemplo, a expressão é “num”, a variável é “num” e a lista é “range(11)”.
A condição “if num % 2 == 0” filtra os elementos da lista que são divisíveis por 2, e a compreensão de lista retorna assim apenas os números pares.
Também é possível adicionar estruturas de controle, como loops e condicionais, dentro da Compreensão de Lista.
Exemplo 02
# Cria uma lista de números de 0 a 100, exceto múltiplos de 3 e 5
lista = [num for num in range(101) if num % 3 != 0 and num % 5 != 0]
print(lista) #
Resultado:
[1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 22, 23, 26, 28, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46, 47, 49, 52, 53, 56, 58, 59, 61, 62, 64, 67, 68, 71, 73, 74, 76, 77, 79, 82, 83, 86, 88, 89, 91, 92, 94, 97, 98]
Aqui, o laço “for num in range(101)” itera sobre os números de 0 a 100. A condição “if num % 3 != 0 and num % 5 != 0” filtra os números que são múltiplos de 3 ou 5, retornando apenas os números que não são múltiplos de 3 ou 5.
Exemplo 03
Suponha que nós desejamos obter os códigos numéricos dos caracteres ASCII que constituem uma string qualquer, e então armazenar esses códigos em uma lista.
Para obter esses códigos, aplicamos a função interna do Python ord em cada caractere da string. Podemos fazer isso usando um laço for ou, de forma mais simples, uma compreensão de lista:
texto = "Bóson Treinamentos em Tecnologia" carASCII = [ord(s) for s in texto] print(carASCII)
Resultado:
[66, 243, 115, 111, 110, 32, 84, 114, 101, 105, 110, 97, 109, 101, 110, 116, 111, 115, 32, 101, 109, 32, 84, 101, 99, 110, 111, 108, 111, 103, 105, 97]
Exemplo 04
No exemplo a seguir usamos dois laços for em uma abrangência de lista, realizando a multiplicação de números de uma lista por valores em uma segunda lista:
combina = [k * m for k in [2,3,5] for m in [10, 20, 30]] print(combina)
Resultado:
[20, 40, 60, 30, 60, 90, 50, 100, 150]
O primeiro valor na lista k é multiplicado por todos os valores na lista m, em seguida o segundo valor de k é multiplicado por todos os valores de m, e finalmente o mesmo ocorre com o terceiro valor de k (como se fosse uma operação distributiva da matemática).
Esse código, se criado usando apenas laços de repetição, ficaria mais longo:
combina = [] for k in [2,3,5]: for m in [10, 20, 30]: combina.append(k * m) print(combina)
Resultado:
[20, 40, 60, 30, 60, 90, 50, 100, 150]
Listas de listas, dicionários e conjuntos (sets)
Uma Compreensão de Lista também pode ser usada para criar listas de listas, dicionários e conjuntos.
Exemplo:
# Cria uma lista de listas
matriz = [[i*j for j in range(1, 6)] for i in range(1, 6)]
print(matriz)
Resultado:
[[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [3, 6, 9, 12, 15], [4, 8, 12, 16, 20], [5, 10, 15, 20, 25]]
Neste exemplo, uma Compreensão de Lista é usada para criar uma lista de resultados que satisfazem a condição especificada no início da lista. Essa é uma abordagem muito poderosa e útil para manipulação de dados e permite que você escreva códigos de forma mais concisa e elegante.
Compreensão de Lista com Condição
Outra forma de usar as compreensões de lista é incluir uma condição para filtrar os elementos que serão adicionados à lista resultante. A sintaxe é a seguinte:
[expressão for item in lista if condição]
Por exemplo, se quisermos criar uma lista que contenha apenas os números ímpares em uma lista de números fornecida, podemos usar a seguinte compreensão de lista (similar ao exemplo 01 anterior):
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] impares = [num for num in numeros if num % 2 != 0] print(impares)
Resultado:
[1, 3, 5, 7, 9]
Aqui, a condição é if num % 2 != 0, que verifica se o número é ímpar. A lista resultante contém apenas os números que satisfazem essa condição.
Compreensão de Lista com Múltiplas Listas
Também é possível usar a compreensão de lista para criar uma nova lista com elementos de várias listas distintas. A sintaxe é a seguinte:
[expressão for item in lista1 for item2 in lista2 ... for itemN in listaN]
Por exemplo, se quisermos criar uma lista que contenha todos os pares ordenados (x, y), onde x é um número par entre 0 e 2 e y é um número ímpar entre 1 e 3, podemos usar a seguinte Compreensão de Lista:
pares_ordenados = [(x, y) for x in range(0, 3, 2) for y in range(1, 4, 2)] print(pares_ordenados)
Resultado:
[(0, 1), (0, 3), (2, 1), (2, 3)]
Aqui, a compreensão de lista usa duas variáveis de iteração, x e y, e duas faixas diferentes de números. A lista resultante contém todos os pares ordenados que satisfazem essas condições.
Conclusão
Compreensão de Lista é uma técnica poderosa e elegante para criar listas em Python. Permite que criemos listas com base em outras listas e pode incluir condições para filtrar os elementos adicionados à lista resultante.
As compreensões de lista obtém os resultados da execução de uma expressão qualquer em uma sequência de valores e retornam esses resultados na forma de uma nova lista.
Aprender a usar a Compreensão de Lista nos ajuda a escrever códigos mais concisos, elegantes e legíveis. Porém, é preciso tomar cuidado, pois as expressões podem se tornar complexas demais e incompreensíveis ao usar esse recurso.
Na prática, deve-se sempre seguir a regra do “quanto mais simples, melhor”, e usar as compreensões de lista quando for necessário obter maior performance na execução do programa.
No geral, as compreensões de lista são um pouco mais rápidas que o uso da função map, e essa função é até duas vezes mais rápida que o emprego de laços for equivalentes.
Escreva um comentário