Python - Listas tridimensionales y sus copias

   
Vista:

Listas tridimensionales y sus copias

Publicado por inedit00 (2 intervenciones) el 01/07/2009 01:39:36
Nota: no se me asusten, parece largo pero se lee en un momento. Gracias por ayudar.
Tengo un problema que no se como solucionar. El caso es que tengo una lista de tres dimensiones ( lista[][][] ), de la cual quiero hacer una copia y una modificación. Al final tiene que quedarme la lista original y la lista modificada. Bien. Que tengo? Pues el siguiente codigo para ilustrar mi problema:

import copy
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
#EJEMPLO 1, QUE FUNCIONA ( per no me sirve de nada )
#Hecha la copia, si se cambia algun elemento de la lista no se modifica el original. Perfecto
a=[]
a =[1,2,3]
b = copy.copy(a)
b[0] = 'helloworld'
print a
print b
#Resultado:
#[1, 2, 3]
#['helloworld', 2, 3]
#EJEMPLO 2, QUE NO FUNCIONA
#Creamos nuestro array tridimensional de prueba. Lo imprimimos. Hacemos la copia. Cambiamos algo y volvemos a imprimir. Y que tenemos? Pues tanto el array original como su copia MODIFICADOS.
m=2
count=0
c = []
for i in range(0,m):
    b = []
    for j in range(0,m):
        a = []
        for k in range(0,m):
            a.append(count)
            count+=1
        b.append(a)
    c.append(b)
 
print c
d = copy.copy(c)
d[0][0][0] = 'hello world'
print c
print d
 
#Resultado :(
#[[[0, 1], [2, 3]], [[4, 5], [6, 7]]]
#[[['hello world', 1], [2, 3]], [[4, 5], [6, 7]]]    <<<< :S
#[[['hello world', 1], [2, 3]], [[4, 5], [6, 7]]]   <<<<< :S

Alguna idea? Se acepta pulpo como animal de compañía. Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Listas tridimensionales y sus copias

Publicado por raul (25 intervenciones) el 04/07/2009 14:44:51
hola inedit00 he encontrado una manera aunque un poco rudimentaria la verdad ,he modificado tu programa y me pasaba como a ti hacia una copia con copia[:]=original[:] (la libreria de copy no la conozco,no se si estara en python 3.0,uso 2.5 todavia) pero al modificarla cambia tambien el original, creo que es problema de que la lista contiene mas listas dentro ,bueno te dejo lo que se me a ocurrido,ya diras que te parece y si te sirve

1
2
3
4
5
6
7
8
9
10
11
12
13
original = []
copia = []
temp=0
temp2=1
while len(original)<=3:
	original.append([temp,temp2])
	copia.append([temp,temp2])
	temp+=2
	temp2+=2
 
copia[0][1]=('hello world')
print original
print copia

Un saludo ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Listas tridimensionales y sus copias

Publicado por [FIX] (2 intervenciones) el 04/07/2009 16:06:24
Muchas gracias. El caso es que en otro foro me han resuleto la duda haciendo uso de la librería COPY. En esta pagina se puede ver la documentación:
http://docs.python.org/library/copy.html

"Lo que estás buscando se llama "deep copy" o copia profunda, que copia recursivamente todos los objetos hijos."

1
2
3
4
5
6
7
a[]
for i in range(0,2):
>a.append('algo')
b = copy.deepcopy(a)
b.append('nuevo')
print a, b
#respuesta: ['algo',algo'] ['algo',algo','nuevo']

Lo he probado y funciona bien. Les dejo aqui el link por si les sirve:
http://www.pcmasmas.com/viewtopic.php?f=93&t=33196&p=249220#p249220

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar