Velocity Reviews > Creating a matrix?

# Creating a matrix?

Ivan Voras
Guest
Posts: n/a

 04-02-2004
Is there a nice(r) way of creating a list of uniform values? I'm currently
using: list('0'*N), which makes a string and then chops it up into a list. I
need it to create a NxN matrix:

matrix =[list('0'*N) for i in range(N)]

(elements need to be mutable afterwards, a shallow copy is bad)

While this is short and concise, it also feels odd

Peter Maas
Guest
Posts: n/a

 04-02-2004
Ivan Voras wrote:
> Is there a nice(r) way of creating a list of uniform values? I'm
> currently using: list('0'*N), which makes a string and then chops it up
> into a list. I need it to create a NxN matrix:
>
> matrix =[list('0'*N) for i in range(N)]

matrix = [['0']*N]*N

Mit freundlichen Gruessen,

Peter Maas

--
-------------------------------------------------------------------
Peter Maas, M+R Infosysteme, D-52070 Aachen, Hubert-Wienen-Str. 24
Tel +49-241-93878-0 Fax +49-241-93878-20 eMail http://www.velocityreviews.com/forums/(E-Mail Removed)
-------------------------------------------------------------------

Mike C. Fletcher
Guest
Posts: n/a

 04-02-2004
N*N matrix of lists...

[ [0]*N for i in range( N ) ]

Seems clearer to me, anyway (and stores actual 0 values, not '0' in the
result). Have fun,
Mike

Ivan Voras wrote:

> Is there a nice(r) way of creating a list of uniform values? I'm
> currently using: list('0'*N), which makes a string and then chops it
> up into a list. I need it to create a NxN matrix:
>
> matrix =[list('0'*N) for i in range(N)]
>
> (elements need to be mutable afterwards, a shallow copy is bad)
>
> While this is short and concise, it also feels odd

_______________________________________
Mike C. Fletcher
Designer, VR Plumber, Coder
http://members.rogers.com/mcfletch/

Ivan Voras
Guest
Posts: n/a

 04-02-2004
Peter Maas wrote:
> Ivan Voras wrote:
>
>> Is there a nice(r) way of creating a list of uniform values? I'm
>> currently using: list('0'*N), which makes a string and then chops it
>> up into a list. I need it to create a NxN matrix:
>>
> > matrix =[list('0'*N) for i in range(N)]

>
> matrix = [['0']*N]*N

I can't believe I didn't try that one

(hmm, actually, I think I tried it but the results were bad for some
reason... oh well, thank you )

Peter Hansen
Guest
Posts: n/a

 04-02-2004
Peter Maas wrote:

> Ivan Voras wrote:
>
>> Is there a nice(r) way of creating a list of uniform values? I'm
>> currently using: list('0'*N), which makes a string and then chops it
>> up into a list. I need it to create a NxN matrix:
>>
> > matrix =[list('0'*N) for i in range(N)]

>
> matrix = [['0']*N]*N

Sorry, Peter, but that's a rookie mistake:

>>> matrix = [['0'] * 4] * 4
>>> matrix

[['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0', '0', '0', '0'], ['0',
'0', '0
', '0']]
>>> matrix[1][2] = '1'
>>> matrix

[['0', '0', '1', '0'], ['0', '0', '1', '0'], ['0', '0', '1', '0'], ['0',
'0', '1
', '0']]

Notice that each of the inner lists contains four seperate references
to the string '0', but the outer repetition simply copies the inner
list four times, resulting in four references to the same inner list!
Changing any one element affects the same entry in each of the other
three lists...

-Peter

Peter Maas
Guest
Posts: n/a

 04-02-2004
Peter Hansen wrote:
> >>> matrix[1][2] = '1'
> >>> matrix

> [['0', '0', '1', '0'], ['0', '0', '1', '0'], ['0', '0', '1', '0'], ['0',
> '0', '1
> ', '0']]
>
> Notice that each of the inner lists contains four seperate references
> to the string '0', but the outer repetition simply copies the inner
> list four times, resulting in four references to the same inner list!
> Changing any one element affects the same entry in each of the other
> three lists...

Sorry:

matrix = [['0']*N for i in range(N)]

Mit freundlichen Gruessen,

Peter Maas

--
-------------------------------------------------------------------
Peter Maas, M+R Infosysteme, D-52070 Aachen, Hubert-Wienen-Str. 24
Tel +49-241-93878-0 Fax +49-241-93878-20 eMail (E-Mail Removed)
-------------------------------------------------------------------

Josiah Carlson
Guest
Posts: n/a

 04-02-2004
> [ [0]*N for i in range( N ) ]

xrange is a bit faster for large N, you don't need to create a list that
gets destroyed.

- Josiah