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.

 

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*