Como prometido, hoje vamos continuar o post de ontem, falando sobre listas em Python, pois este é uma assunto bastante extenso.
O assunto de hoje é List Comprehension, ou em português, abrangência de listas. Como o termo em português não retrata bem o que este recurso faz, vamos usar o termo em inglês mesmo.
List Comprehension é um recurso do Python que permite a criação de listas de forma simples, usando simplesmente uma expressão seguida de um for que pode conter outros for e/ou if dentro dele.
Tudo ficará mais claro ao partirmos para os exemplos.
Então, vamos colocar a mão na massa! Abra o shell do Python.
Lembre-seque o que deve ser digitado estará precedido de >>> ou ..., assim como aparecerá no shell do python.
Se por acaso você não entendeu do que estou falando, é aconselhável que você leia antes os posts anteriores que te deixarão em dia com tudo que vimos até agora.
Procure entender exatamente o que acontece em cada exemplo. Vamos lá!
>>> l = [1, 2, 4]>>> [3 * x for x in l][3, 6, 12] >>> [2 * x for x in l if x > 3][12]>>> 5 * x for x in l if x < 0][]>>> [[x, 2*x] for x in l][[1, 2], [2, 4], [4, 8]]>>> [(x, 2*x) for x in l][(1, 2), (2, 4), (4, 8)]>>> l1 = [0, 1, 2]>>> l2 = [1, 2, 3]>>> [x * y for x in l1 for y in l2][0, 0, 0, 1, 2, 3, 2, 4, 6]>>> [l1[i] * l2[i] for i in range(len(l1))][0, 2, 6]
As instruções são sempre dadas no mesmo padrão:
[<expressao> for <variável> in <lista> [if <condição>] [for...]]*** As estruturas entre [] são opcionais. ***
Agora chegamos ao ponto em que devemos responder o desafio de ontem para prosseguir.
No último post, ficou um desafio: "Quem imagina como fazer uma matriz em Python usando o que vimos hoje???"
A resposta é: Criar listas de listas!
Então, se fizermos:
>>> m = [[1, 2, 3],[2, 3, 4]]
Teremos a matriz m com 2 linhas e 3 colunas, contendo na primeira linha os valores 1, 2, 3 e na segunda os valores 2, 3 e 4.
Assim, podemo usar list comprehention também para criarmos matrizes. Chamamos este recurso de Nested List Comprehention (nested = aninhado).
Vejamos o seguinte exemplo:
>>> m = [... [1, 2, 3],... [4, 5, 6],... [7, 8, 9],... ]
Aqui, criamos uma matriz 3x3 com os valores de 1 a 9.
Agora, veja uma forma de trocar as linhas com as colunas da matriz m:
>>> [[linha[i] for linha in m] for i in [0, 1, 2]][[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Acho que por hoje, este recurso está bem ilustrado. Qualquer dúvida, postem nos comentários que a resposta será rápida!
Comentem!
Assinem o Feed e não percam nenhum Post do Programe em Python!
Abraços!
Até a Próxima!

Este ultimo comando, não consegui entender oq ela faz!
ResponderExcluir>>> [[linha[i] for linha in m] for i in [0, 1, 2]]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Inicilmente m valia [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
ResponderExcluirE a execussão deste comando retornou [[1, 4, 7], [2, 5, 8], [3, 6, 9]] que é a matriz inversa de m.
Faça o seguinte:
Decomponha o comando. Você já tem m da forma q foi criada acima, certo.
Então, decompondo, ficaria assim:
x = []
for i in [0, 1, 2]:
y = []
for linha in m:
y.append(linha[i])
x.append(y)
no final, x terá a mesma lista [[1, 4, 7], [2, 5, 8], [3, 6, 9]].
Analise o que estes 'for' estão fazendo... qualquer coisa faça um teste de mesa pra ajudar. Se mesmo assim, não entender, fique à vontade pra perguntar novamente.
Obrigado pelo comentário!
x = []
ResponderExcluirfor i in [0, 1, 2]:
----y = []
----for linha in m:
--------y.append(linha[i])
----x.append(y)
Com idenação...
Muito obrigado pela resposta, consegui compreender muito bem.
ResponderExcluirE parabéns pelo post.
Eu que agradeço pela participação e fico feliz por ter compreendido a idéia :D.
ResponderExcluirAbraços!
Julio, como eu faria para trocar as linhas de uma matriz, entre si?
ResponderExcluirOlá!
ResponderExcluirBom, pra trocar a linha x de uma matriz mat com a linha y, faça assim:
mat[x], mat[y] = mat[y], mat[x]
e as linhas serão trocadas...
Espero que tenha respondido.
Abraço!
Primeiro quero parabenizá-lo pela belka explicação, e se possivel me dê uma dica de como somar os elementos de duas listas e colocar a soma em uma terceira lista: criei duas listas com valores e usei o append, mas deu erro.
ResponderExcluirOlá Maria, obrigado!
ExcluirO comando append acrescenta elementos à lista, então sua solução realmente não funcionaria
Supondo a lista x = [1, 2, 3] e y = [3, 2, 1]
faça através de list comprehension:
[a + b for (a, b) in zip(x, y)]
e terá [4, 4, 4]
Tenha uma ótima tarde!
Boa noite, primeiramente gostaria de agradecer por suas publicações pois estão me ajudando muito agora que estou iniciando no python... Minha duvida é a seguinte...
ResponderExcluirDigamos que eu crie um matriz inicialmente vazia:
mat = [[None for i in range(2)]for i in range(2)]]
Como eu faço para que o usuário que informe os valores da matriz e o programa mostre esses valores no final...
Desde já agradeço a resposta!
Olá Hudson!
ExcluirBom, obrigado pelo elogio! Bom saber que o blog tem ajudado!
Primeiro, em python uma matriz vazia é mat=[].
O que você fez foi na verdade ali é criar uma matriz cheia de Nones.
Quanto a mostrar a matriz, se quiser mostrar como matriz mesmo, printe os valores dentro de um for, aliás, dentro de for's aninhados.
Pra ler os dados, use a estratégia que descrevo aqui nesta resposta:
http://programeempython.blog.br/2010/07/estruturas-de-dados-em-python-listas.html?showComment=1383828732346#c1878976760542259461
A diferença é que serão 2 for, um pras colunas e outro pras linhas.
Espero que tenha te ajudado! Se não ficou claro, fique à vontade para perguntar novamente!
Abraço!
Opa.. eu já tinha visto este comentário que vc falou...achei a duvida bem parecida.. mas tentei fazer com a matriz e não deu certo.. procurei já em vários sites porém nenhum mostra um exemplo prático... se você poder mostrar um exemplo eu agradeceria bastante! ahh.. desculpa ae por incomodar com algo tão besta!
ExcluirUm exemplo simples
Excluirmat = []
for i in xrange(x):
____linha = []
____for j in xrange(y):
________linha.append(input('Entre com o elemento (%d, %d) da matriz' % (x, y)))
____matriz.append(linha)
Assim você tem uma matriz com os dados inseridos pelo usuário.
Espero que ajude!
Abraço!
ajudou sim.. agora entendi melhor como funciona a matriz.. obrigado pela força!
ExcluirFico.feliz que tenha ajudado :-)
ExcluirImportante é pensar sempre nas matrizes como listas que contém listas. Assim você pode montar matrizes n dimensionais sem problemas!
Olá ,parabéns pelo post, está me ajudando muito, eu gostaria de saber como posso somar duas colunas ou duas linhas de modo que elas troquem de posição ao somar .
ResponderExcluirOpa! Tem como dar um exemplo? Não entendi muito bem...
Excluir