# Creating a matrix?

Discussion in 'Python' started by Ivan Voras, Apr 2, 2004.

1. ### Ivan VorasGuest

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

Ivan Voras, Apr 2, 2004

2. ### Peter MaasGuest

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
-------------------------------------------------------------------

Peter Maas, Apr 2, 2004

3. ### Mike C. FletcherGuest

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/

Mike C. Fletcher, Apr 2, 2004
4. ### Ivan VorasGuest

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 )

Ivan Voras, Apr 2, 2004
5. ### Peter HansenGuest

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 Hansen, Apr 2, 2004
6. ### Peter MaasGuest

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
-------------------------------------------------------------------

Peter Maas, Apr 2, 2004
7. ### Josiah CarlsonGuest

> [ [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

Josiah Carlson, Apr 2, 2004