Introdução à programação e aos algoritmos
5.4 Listas por Compreensão
Crie uma lista com os números ímpares entre 0 e 100 (use range()) e depois
use o comando enumerate() para percorrer a lista transformando o valor de cada
elemento no valor par subsequente.
EXERCÍCIO 5.6
Modi que o Programa 4.23 que calcula pi para que este não mais solicite o
número de pontos a serem gerados, mas gere uma tabela com ao menos 10
valores de pi calculados com números diferentes de pontos. Sua tabela deve
possuir ao menos 10 valores diferentes. Use range() para gerar os diversos
valores de entrada da função.
5.4 LISTAS POR COMPREENSÃO
O sentido mais comum da palavra “compreensão” é o de “entendimento”: “eu tenho compreensão de algo se eu entendo algo”. Porém, a palavra também significa “estar contido em”: “o conceito de Homem compreende animal e racional”, ou seja, o conceito de Homem contém em si o conceito de animal e racional. Explicado o termo, vamos a Python.
Se você precisar criar uma lista a partir de elementos que
pertençam a uma lista já existente, Python oferece uma maneira prática de fazê-lo: a lista por compreensão. O que quer dizer isso? Poderíamos chamar também de “listas por continência”, mas vou manter o termo compreensão para ficar próximo àquele que você encontrará em muitos livros em inglês sobre a linguagem. Vamos criar listas a partir de elementos contidos em uma sequência de elementos.
A forma geral para carregar os valores de uma lista, em Python
é:
lista = []
for item in algum_iterável:
lista.append(Expressão)
Um iterável é um elemento que pode ser percorrido, isto é, um objeto composto de múltiplos elementos, mas que pode ter cada elemento acessado individualmente e em sequência. Portanto, qualquer sequência ou lista de elementos pode ser iterável. O que o trecho de código faz é inicialmente criar uma lista vazia (lista = [] ) e, em seguida, para cada item do “iterável” (for item in algum_iterável: ), executar a ação de adicionar à lista um elemento cujo valor é calculado pela expressão ( lista.append(Expressão)).
O uso constante deste tipo de construção levou à criação de uma sintaxe mais compacta para efetuar a mesma ação:
lista = [Expressão for item in algum_iterável]
Digamos que vamos criar uma lista em que cada elemento será o quadrado de uma outra lista de base. Podemos dizer que um elemento da nova lista é criado para cada elemento contido na lista original. Em linguagem informal, dizemos que um elemento da nova lista é igual a x ao quadrado, de modo que x assume o valor de cada elemento da lista antiga. Em Python ficaria assim:
lista_nova = [x*x for x in lista_antiga]
O Programa 5.15 mostra como podemos criar novas listas a partir de listas já existentes ou qualquer iterável que possa ser percorrido com um comando for.
lista = [1, 2, 3, 5, 7]
lista_nova = [x*x for x in lista]
lista_quadrados = [x*x for x in range(5)] print (lista_nova)
print (lista_quadrados)
■ Programa 5.15: Criando listas por compreensão.
O programa tem como resultado:
[1, 4, 9, 25, 49]
[0, 1, 4, 9, 16]
Outra possibilidade é a de filtrar a entrada, escolhendo apenas
alguns elementos da sequência original para gerar a nova lista. Por exemplo, gerando uma lista apenas com os quadrados dos números ímpares de 0 a 9.
lista_nova = [x*x for x in range(10) if x % 2 == 1]
print (lista_nova)
■ Programa 5.16: Criando listas por compreensão e filtro.
obtemos:
[1, 9, 25, 49, 81]
Traduzindo o comando, range(10) gera a sequência de números
entre 0 e 9. Mas o número gerado só será utilizado para gerar seu quadrado se o resto da divisão inteira por 2 for igual a 1, ou seja, se o número for ímpar.
O mecanismo de criação de lista por compreensão não é
limitado apenas a números. Você pode usar também outros tipos. O Programa 5.17 cria uma lista com nomes e depois atribui a cada elemento de uma nova lista uma saudação e o nome lido da lista de nomes.
nomes = [‘José’, ‘João’, ‘Joaquim’]
lista = [‘Bom dia, ‘ + x for x in nomes]
for saudacao in lista:
print (saudacao)
■ Programa 5.17: Criando listas por compreensão e filtro.
O resultado é:
Bom dia, José
Bom dia, João
Bom dia, Joaquim