Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Newbiequestion about lists and arrays.... (http://www.velocityreviews.com/forums/t322143-newbiequestion-about-lists-and-arrays.html)

Michael 09-06-2003 09:20 PM

Newbiequestion about lists and arrays....
 
Hi pythonians! (or whatever you call yourselfs...)

I would like to use an multidimensional matrix (3D or more) with
numbers (int:s and float:s). Could i use lists or arrays? How can i
retrieve a single element out of a list thats already in an other list
thats already in an other list (and so on...)

An example...

c=[1]*3
for y in range(3):
for x in range(3):

c[x]=[1,2,3]
p[y]=c

p[1][1][1]=888
print p[1][1][1]
print p



for this code example, how do i assign 888 to only one element (for
example, the element in the middle) in the matrix and not to the three
elements shown below?

>>>

888
[[[1, 2, 3], [1, 888, 3], [1, 2, 3]],
[[1, 2, 3], [1, 888, 3], [1, 2, 3]],
[[1, 2, 3], [1, 888, 3], [1, 2, 3]]]
>>>


Why does:

p[0][1][1]=888

and

p[1][1][1]=888

print out the same result?

Helping bitteplease.

/Michael

Erik Max Francis 09-06-2003 09:26 PM

Re: Newbiequestion about lists and arrays....
 
Michael wrote:

> I would like to use an multidimensional matrix (3D or more) with
> numbers (int:s and float:s). Could i use lists or arrays? How can i
> retrieve a single element out of a list thats already in an other list
> thats already in an other list (and so on...)


It's because Python doesn't have copy semantics. You're building a list
of lists of lists, some of whose elements are references to the same
list.

To ensure that these lists are all distinct objects, and thus giving you
the expected behavior, don't use references to previous objects; create
new ones instead:

>>> c = []
>>> for x in range(3):

.... xs = []
.... for y in range(3):
.... ys = []
.... for z in range(3):
.... ys.append([1, 2, 3])
.... xs.append(ys)
.... c.append(xs)
....
>>> c

[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]],
[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]]]
>>> c[1][1][1] = 888
>>> c

[[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], 888, [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]], [[[1,
2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2,
3], [1, 2, 3], [1, 2, 3]]]]

There are other ways to do the job, of course, involing say list
comprehensions.

--
Erik Max Francis && max@alcyone.com && http://www.alcyone.com/max/
__ San Jose, CA, USA && 37 20 N 121 53 W && &tSftDotIotE
/ \ You're wasting time / Asking what if / You linger on too long
\__/ Chante Moore

Sean Ross 09-06-2003 10:34 PM

Re: Newbiequestion about lists and arrays....
 
"Michael" <holmboe@kth.se> wrote in message
news:9193c0d1.0309061320.a0f430f@posting.google.co m...

[snip]

> c=[1]*3
> for y in range(3):
> for x in range(3):
>
> c[x]=[1,2,3]
> p[y]=c
>
> p[1][1][1]=888
> print p[1][1][1]
> print p


[snip]

> Why does:
>
> p[0][1][1]=888
>
> and
>
> p[1][1][1]=888
>
> print out the same result?



Hi.
The problem is with "p[y] = c". This line binds p[y] to whatever c is bound
to.

c
\
[[1,2,3], [1,2,3], [1,2,3]]
/
p[y]

But, then, you've done this for all p[y], 0<=y<3, so

c
\
[[1,2,3], [1,2,3], [1,2,3]]
/ | |
p[0] p[1] p[2]


Now you modify p[1][1][1]:

p[1][1][1] = 888

with this result:

c
\
[[1,2,3], [1,888,3], [1,2,3]]
/ | |
p[0] p[1] p[2]


Thus, p, which is [p[0], p[1], p[2]], looks like

[[[1, 2, 3], [1, 888, 3], [1, 2, 3]],
[[1, 2, 3], [1, 888, 3], [1, 2, 3]],
[[1, 2, 3], [1, 888, 3], [1, 2, 3]]]

Which is not what you wanted. To avoid this, you need only change

p[y] = c

to

p[y] = c[:]


c[:] creates a copy of whatever c was bound to. p[y] is then bound to that
copy.

c
\
[[1,2,3], [1,2,3], [1,2,3]] # original

[[1,2,3], [1,2,3], [1,2,3]] # copy (c[:])
/
p[y]

This happens for each y, 0<=y<3, so

c
\
[[1,2,3], [1,2,3], [1,2,3]] # original

[[1,2,3], [1,2,3], [1,2,3]] # copy (c[:])
/
p[0]

[[1,2,3], [1,2,3], [1,2,3]] # copy (c[:])
/
p[1]

[[1,2,3], [1,2,3], [1,2,3]] # copy (c[:])
/
p[2]

Now, when you do

p[1][1][1] = 888

The result is

c
\
[[1,2,3], [1,2,3], [1,2,3]]

[[1,2,3], [1,2,3], [1,2,3]]
/
p[0]

[[1,2,3], [1,888,3], [1,2,3]]
/
p[1]

[[1,2,3], [1,2,3], [1,2,3]]
/
p[2]

And, thus, p, which is [p[0], p[1], p[2]], looks like:

[[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 888, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]]

Which is what you were looking for.


Or, you could just build 'p' using a list comprehension:

>>> from pprint import pprint as puts
>>> p = [[[1,2,3] for y in range(3)] for x in range(3)]
>>> p[1][1][1] = 888
>>> puts(p)

[[[1, 2, 3], [1, 2, 3], [1, 2, 3]],
[[1, 2, 3], [1, 888, 3], [1, 2, 3]],
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]]

Which is also what you were looking for.

HTH
Sean














All times are GMT. The time now is 10:42 AM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57