Gerar matriz em Python com List Comprehension

826 views
Skip to first unread message

Marco André Lopes Mendes

unread,
Feb 23, 2012, 4:34:56 PM2/23/12
to python...@googlegroups.com
Olá

Criei o seguinte código pra criar uma matriz, colocaralguns valores nela e depois imprimi-los: http://pastebin.com/kxm20t7M

Alguém sabe me dizer como gerar a mesma matriz usando list comprehensions, caso seja possível?

Um abraço

Marco André
marco...@gmail.com
http://www.google.com.br/profiles/marcoandre

João Víctor Rocon Maia

unread,
Feb 23, 2012, 4:52:53 PM2/23/12
to python...@googlegroups.com
matriz = [ [ i + 1 + j*4 for i in range(4)] for j in range(3)]

Marco André Lopes Mendes

unread,
Feb 23, 2012, 5:03:50 PM2/23/12
to python...@googlegroups.com
2012/2/23 João Víctor Rocon Maia <maia...@gmail.com>

matriz = [ [ i + 1 + j*4 for i in range(4)] for j in range(3)]

Valeu João, obrigado pela resposta!

Um abraço

Marco André 

Luciano Ramalho

unread,
Feb 23, 2012, 5:15:54 PM2/23/12
to python...@googlegroups.com
2012/2/23 Marco André Lopes Mendes <marco...@gmail.com>:

> 2012/2/23 João Víctor Rocon Maia <maia...@gmail.com>
>>
>> matriz = [ [ i + 1 + j*4 for i in range(4)] for j in range(3)]
>
>
> Valeu João, obrigado pela resposta!

O João Victor já mandou muito bem na resposta, mas quero aproveitar
para dar dicas complementares:

1) A seção 5.1.4 do Tutorial Python [1] tem uma boa discussao sobre listcomps:

[1] http://turing.com.br/pydoc/2.7/tutorial/datastructures.html#list-comprehensions-ou-abrangencias-de-listas

2) No exemplo do pastebin http://pastebin.com/kxm20t7M o uso da funcão
range se justifica para montar a matriz, mas usar o range para exibir
a matriz montada não é uma boa prática: em geral, deve-se evitar usar
o range para iterar sobre sequencias que já estão prontas, pois o
mecanismo de iteração do for em Python dispensa isso, e assim evitamos
os erros de off-by-one que são tão comuns em C e outras linguagens que
só tem o for primitivo.

Veja neste outro pastebin http://pastebin.com/REzVBvYW uma comparação
entre o laço de impressão usando range e sem usar. A segunda versão,
além de ser mais fácil de ler, é mais flexível: ela funciona para
qualquer quantidade de linhas e colunas na matriz m.

Valeu!

[ ]s
Luciano


--
Luciano Ramalho
Twitter: @luciano
Autor e instrutor da Academia Python na Globalcode
http://python.globalcode.com.br

João Víctor Rocon Maia

unread,
Feb 23, 2012, 5:21:43 PM2/23/12
to python...@googlegroups.com
Bem lembrado Luciano, tinha esquecido desse detalhe.
Como foi só Ctrl C Ctrl V p/ testar nem me toquei! hehehe

Marco André Lopes Mendes

unread,
Feb 23, 2012, 5:22:41 PM2/23/12
to python...@googlegroups.com
2012/2/23 Luciano Ramalho <luc...@ramalho.org>


1) A seção 5.1.4 do Tutorial Python [1] tem uma boa discussao sobre listcomps:

[1] http://turing.com.br/pydoc/2.7/tutorial/datastructures.html#list-comprehensions-ou-abrangencias-de-listas

Valeu pela dica!

2) No exemplo do pastebin http://pastebin.com/kxm20t7M o uso da funcão
range se justifica para montar a matriz, mas usar o range para exibir
a matriz montada não é uma boa prática: em geral, deve-se evitar usar
o range para iterar sobre sequencias que já estão prontas, pois o
mecanismo de iteração do for em Python dispensa isso, e assim evitamos
os erros de off-by-one que são tão comuns em C e outras linguagens que
só tem o for primitivo.

Veja neste outro pastebin http://pastebin.com/REzVBvYW  uma comparação
entre o laço de impressão usando range e sem usar. A segunda versão,
além de ser mais fácil de ler, é mais flexível: ela funciona para
qualquer quantidade de linhas e colunas na matriz m.

Sim, você acertou: eu adaptei um programa em C. Se tivesse feito ele, provavelmente não teria usado o range. Valeu pela lembrança.

Um abraço

Marco André 

Christian S. Perone

unread,
Feb 23, 2012, 7:56:22 PM2/23/12
to python...@googlegroups.com
Se você não tem um motivo forte para estar usando matrizes em Python puro, você poderia usar o numpy, que é hoje a lingua franca para computação científica em Python:

>>> arange(12).reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

Performance usando numpy:

# python -m timeit -s "import numpy as np" "matriz = np.arange(12).reshape(3,4)"
100000 loops, best of 3: 2.45 usec per loop

Performance usando list comprehension:

# python -m timeit "matriz = [ [ i + 1 + j*4 for i in range(4)] for j in range(3)]"
100000 loops, best of 3: 6.3 usec per loop

Além de ter uma construção mais elegante, é 2.5x mais veloz que list comprehension, enfim, fica aí a sugestão.

--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com



--
"Forgive, O Lord, my little jokes on Thee, and I'll forgive Thy great big joke on me."
http://pyevolve.sourceforge.net/wordpress/

João Víctor Rocon Maia

unread,
Feb 23, 2012, 8:05:06 PM2/23/12
to python...@googlegroups.com
+1 Christian

2012/2/23 Christian S. Perone <christia...@gmail.com>



--
João Víctor Rocon Maia
www.joaovrmaia.com.br


Reply all
Reply to author
Forward
0 new messages