Compreensão de listas e expressões geradores são recursos de Python para criar e manipular listas e sequências. São forma mais concisas para fazer algo que, de outra forma, demandaria várias linhas de código.
A sintaxe básica de Compreensão de Listas:
[expr for item in lista]
[expr for item in lista if <condição>]
[expr for item1 in lista1 for item2 in lista2]
A sintaxe básica de Expressões geradoras:
(expr for item in lista)
(expr for item in lista if <condição>)
(expr for item1 in lista1 for item2 in lista2)
Para exemplicar, considere que tenhamos uma lista de números inteiros e queiramos gerar outra lista com estes valores elevados ao cubo. Esta tarefa poderia ser realizada pelo programa abaixo:
lista = [ 10, 8, 13, 2]
lista_cubos = []
for x in lista:
lista_cubos.append(x ** 3)
print(lista_cubos)
A compreensão de listas oferece uma forma mais concisa de fazer a mesma tarefa. Neste caso:
lista = [ 10, 8, 13, 2]
lista_cubos = [x ** 3 for x in lista]
print(lista_cubos)
Outro exemplo típico de uso de compreensão de listas é na entrada de dados via comando input. Considere que desejamos obter uma série de valores inteiros contidos numa única linha:
10 23 18 45
Esta ação pode ser realizada pelo programa abaixo
numeros = input().split()
for i in range(len(numeros)):
numeros[i] = int(numeros[i])
print(numeros)
Esta mesma ação pode ser escrita de forma mais concisa como:
numeros = [int(x) for x in input().split()]
print(numeros)
Agora considere que os dados de entrada estejam em linhas distintas como no exemplo abaixo no qual o primeiro valor (inteiro) indica o número de notas (interva 0 a 10) obtidas por uma aluno e desejamos calcular a média dessas notas:
3
10.0
7.5
8.8
Essas tarefa pode ser realizada pelo seguinte código Python:
n = int(input())
soma = 0
for _ in range(n):
soma += float(input())
media = soma / n
print(media)
O código acima pode ser escrito de forma mais sintética por meio de compreensão de listas:
n = int(input())
media = sum([float(input()) for _ in range(n)]) / n
print(media)
O código também pode ser escrito utilizando uma Expressão Geradora, bastando retirar os caracteres [ e ] na expressão de soma.
n = int(input())
media = sum( float(input()) for _ in range(n) ) / n
print(media)
Apesar de semanticamente equivalentes, há uma diferença significativa entre as duas soluções quanto ao uso de memória, assim como no tempo de execução para diversas operações, em particular para sequências muito grandes.
Compreensão de listas: inicialmente é gerada a lista para só depois os valores serem somados, fato que resulta em maior consumo de memória.
Expressão Geradora: ocorre uma avaliação "preguiçosa", no sentido de que os valores vão sendo somados à medida que vão sendo lidos, não ocorrendo armazenamento de toda a sequência.
A compreensão de listas também pode incluir expressões condicionais de forma a selecionar valores, cuja sintaxe básica é:
[expr for item in lista if cond]
Para exemplificar, suponha que desejamos selecionar apenas os valores negativas de uma lista de números:
valores = [10, -5, 18, -23, -12, 0, 43]
valores_negativos = [x for x in valores if x < 0]
print(valores_negativos)
# Selecionar as frutas cujo nome iniciam pela letra 'L', tanto maiúscula como minúscula
frutas = ['Abacate', 'Laranja', 'mamão', 'limão', 'Pera', 'Goiaba']
frutas_l = [fruta for fruta in frutas if fruta[0].upper() == 'L']
print(frutas_l)
# O produto cartesiano de dois conjuntos (operando sobre conjuntos)
A = {'a', 'b', 'c'}
B = {1, 3, 5, 7}
produto_cartesiano = { (x,y) for x in A for y in B }
print(produto_cartesiano)
# Cálculo do desvio padrão de uma série de valores
import math
# Obtém a quantidade de valores
n = int(input())
# Lé os valores (um em cada linha) e armazena numa lista
valores = [float(input()) for _ in range(n)]
# Calcula a média dos valores
media = sum(valores) / len(valores)
# Cálcula o somatórios das diferenças quadráticas dos valores em relação à media
somatorio = sum( (x-media)**2 for x in valores )
# Cácula o desvio padrão
dp = math.sqrt(somatorio / (n-1))
print(dp)
# Dada uma lista de nomes, cria uma dicionário que faz uma mapeamento entre o nome e sua posição na lista
nomes = ["Mafalda", "Magali", "Huguinho", "Zezinho", "Luizinho"]
mapeamento = dict( (nome, posicao) for posicao, nome in enumerate(nomes) )
print(mapeamento)
Obter a matriz transposta de uma matriz:

matriz = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]]
transposta = [ [linha[i] for linha in matriz] for i in range(len(matriz[0])) ]
print(transposta)
# Somar os valores da 2ª coluna da matriz
col = 1
num_linhas = len(matriz)
soma = sum( matriz[i][col] for i in range(num_linhas) )
print(soma)
# Obter a maior soma dentre as somas da colunas da matriz
num_linhas = len(matriz)
num_colunas = len(matriz[0])
maior_soma = max( sum(matriz[i][j] for i in range(num_linhas)) for j in range(num_colunas) )
print(maior_soma)