Foros del Web » Programando para Internet » Python »

Multiplicación en listas

Estas en el tema de Multiplicación en listas en el foro de Python en Foros del Web. Hola a todos: Lo que quiero hacer es muy simple, a esta lista de listas coeffs=[[1,1,1,2,1],[7,0,3,-4,3],[11,-6,0,3,-3]], le quiero multiplicar una lista que se crea aleatoriamente ...
  #1 (permalink)  
Antiguo 25/09/2010, 15:36
 
Fecha de Ingreso: septiembre-2010
Mensajes: 18
Antigüedad: 13 años, 7 meses
Puntos: 0
Multiplicación en listas

Hola a todos:

Lo que quiero hacer es muy simple, a esta lista de listas

coeffs=[[1,1,1,2,1],[7,0,3,-4,3],[11,-6,0,3,-3]], le quiero multiplicar una lista que se crea aleatoriamente con 0 y 1, pero esta lista tiene solo 5 posiciones
ej:[[0], [0], [0], [0], [1]], lo que debo lograr es que esta lista multiplique a cada posición i de la lista coeffs.

coeffs[i][j] -> i=1...3 j=1...5 , no sé si queda claro

de todas maneras aqui va lo que estoy intentando
Código Python:
Ver original
  1. def crea_sol_inicial():
  2.     vs=[]
  3.     from random import randint    
  4.     for i in range(size):
  5.         vs.append([randint(0,100)%2])
  6.    
  7.     val=[]
  8.     for i in range(csize):
  9.         for j in range(size):
  10.             aux=coeffs[i][j]*vs[j]
  11.             val.append(aux)
  12.     print val

El resultado de val es asqueroso...y en fin no es lo que quiero, un resultado valido seria que se formara una lista parecida a coeffs, lo unico q seria 0 y 1
Ej: val=[[1,1,0,0,0],[1,0,1,0,1],[1,1,0,1,0]], luego el paso a seguir es sumar todos esos 0 y 1 que me quedo en la lista y que fuera un solo valor, en ese caso seria 8.

El codigo en C esta escrito de esta manera, a lo mejor con eso entienden mejor
Código C:
Ver original
  1. /* Verifica factibilidad */
  2. int evalFactibility(int* vs) {
  3. for (int i = 0; i < CSIZE; i++) {
  4.     int val = 0;
  5.     for (int j = 0; j < SIZE; j++) {
  6.         val += coeffs[i][j] * vs[j];
  7.     }
  8.  
  9.  
  10. }
  11.  
  12. int* getRandomString() {
  13. int* vs = new int[SIZE];
  14.  
  15. vs[0] = 0;
  16. vs[1] = 0;
  17. vs[2] = 1;
  18. vs[3] = 1;
  19. vs[4] = 0;
  20. srand((unsigned)time( NULL ) );
  21. do {
  22.    for (int i = 0; i < SIZE; i++) {
  23.        vs[i] = rand()%2;
  24.    }
  25. } while(!evalFactibility(vs));
  26. return vs;
  27. }
  #2 (permalink)  
Antiguo 25/09/2010, 19:23
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Multiplicación en listas

No se muy bien lo que quieras hacer apesar del codigo que das en C++ y Python:
Entiendo algunas partes, pero otras no concuerda lo que quieres hacer en python y lo que haces en C++

A los 2 códigos les faltan cosas, solo para aclarar.

Lo que haces es:
1.- Tienes una lista de listas que contienen los coeficientes de X cosa.
2.- Generas una lista de 0's y 1's de manera aleatoria.
3.- Haces la suma de los, coeficientes multiplicados por la lista generada en el paso anterior ???
4.- Regresas una lista con la suma de los valores. ???

Los pasos 3 y 4 son diferentes en C++ y Python. Por eso no se lo quieres.
  #3 (permalink)  
Antiguo 25/09/2010, 22:14
 
Fecha de Ingreso: septiembre-2010
Mensajes: 18
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Multiplicación en listas

Bueno, ocurre que lo q estoy haciendo es traspasar el codigo en C++ a Python

De todas maneras despues de cabecear harto, he logrado hacer algunas cosas mas...lo que te he dado son partes de codigo y a lo mejor falta informacion, lo que necesito es lo siguiente:
Tengo 2 listas
a=[3,2,-5,-2,3]
b=[[1,1,1,2,1],[7,0,3,-4,3],[11,-6,0,3,-3]]

y debo multiplicarlas por otra lista que para este ejemplo será:
c=[0,1,0,1,0]
Para la multiplicacion de a con b, tengo el siguiente codigo:
Código Python:
Ver original
  1. a=[3,2,-5,-2,3]
  2. b=[[1,1,1,2,1],[7,0,3,-4,3],[11,-6,0,3,-3]]
  3. c=[0,1,0,1,0]
  4. size=5
  5. csize=3
  6.  
  7. def sumar(x,y):
  8.     return x+y
  9.  
  10. def funcion1():
  11.     aux=[0]*size
  12.     for i in range(size):
  13.         aux[i]=a[i]*c[i]
  14.     aux2=reduce(sumar,aux)
  15.     print aux
  16.     print aux2
  17.  
  18. funcion1()

El resultado de la nueva lista=[0, 2, 0, -2, 0] y la suma de todos sus indices es 0

Ahora para la multiplicación de b con c, tengo problemas, ya que es una lista de listas, si bien la multiplicacion me resulta al sumar no sé como hacerlo, porque debo sumar el primer indice de la lista q es una lista y esa me arroja un resultado, luego con la siguiente y asi sucesivamente
tengo esto:
Código Python:
Ver original
  1. a=[3,2,-5,-2,3]
  2. b=[[1,1,1,2,1],[7,0,3,-4,3],[11,-6,0,3,-3]]
  3. c=[0,1,0,1,0]
  4. size=5
  5. csize=3
  6. def sumar(x,y):
  7.     return x+y
  8. def funcion2():
  9.    
  10.    
  11.     val=[[0]*size for i in range(csize)]
  12.     aux=[]
  13.     for i in range(csize):
  14.         for j in range(size):
  15.             val[i][j]=b[i][j]*c[j]
  16.             aux.append(val[i][j])
  17.             aux2=reduce(sumar,aux)
  18.         print aux2
  19.  
  20.     print val    
  21.            
  22.            
  23. funcion2()

Lo que me tira es la lista val=[[0, 1, 0, 2, 0], [0, 0, 0, -4, 0], [0, -6, 0, 3, 0]]
y los valores 3,-1,-4 , pero lo que realmente debe salir es 3,-4,-3, obviamente el procedimiento q estoy haciendo esta malo, porque esta sumando toda la lista, lo mismo que hace en la primera funcion, el problema es q no sé como hacer

Espero q ahora haya quedado más claro :S
  #4 (permalink)  
Antiguo 25/09/2010, 22:46
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Multiplicación en listas

Aquí esta tu código corregido

Código Python:
Ver original
  1. def function2():
  2.     val = [[0]*size for i in range(csize)]
  3.     for i in range(csize):
  4.         aux = [] #Esto estaba mal
  5.         for j in range(size):
  6.             val[i][j] = b[i][j] * c[j]
  7.             aux.append(val[i][j])
  8.         aux2=sum(aux) #Lo tenias dentro del for j, cuando debería estar afuera
  9.         print aux2
  10.     print val

Edito: Veo que tienes un buen "Pythonic level" sigue asi.

Aquí esta tu código, pero mejorado:
Código Python:
Ver original
  1. def fun1(l1, l2):
  2.     #Asumo que l1 y l2 son de la misma longitud
  3.     size = len(l1)
  4.     aux = [l1[i] * l2[i] for i in xrange(size)]
  5.     return sum(aux), aux
  6.  
  7. def fun2(l1, l2):
  8.     #l1 es la lista de listas y l2 es c
  9.     vals = [fun1(i, l2) for i in l1]
  10.     print vals
  11.  
  12. a = [3, 2, -5, -2, 3]
  13. b = [[1, 1, 1, 2, 1], [7, 0, 3, -4, 3], [11, -6, 0, 3, -3]]
  14. c = [0, 1, 0, 1, 0]
  15. fun2(b, c)

Veo que tienes un buen "Pythonic level" sigue asi
  #5 (permalink)  
Antiguo 26/09/2010, 22:58
 
Fecha de Ingreso: septiembre-2010
Mensajes: 18
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Multiplicación en listas

Gracias, me sirvio de mucho...ese cumplido fue para mi??...

Ahora me encuentro con otro problemita, estoy a punto de terminar este codigo, pero me tope con un do-while en C++
Por lo que he investigando, Python no tiene ese bucle...

Lo más razonable seria usar otros bucles y condiciones para que se comporte como tal,sin embargo por mas que he intentado no me ha resultado!!!

Aqui va un ejemplo
Código C++:
Ver original
  1. int* getRandomString() {
  2. int* vs = new int[SIZE];
  3.  
  4. vs[0] = 0;
  5. vs[1] = 0;
  6. vs[2] = 1;
  7. vs[3] = 1;
  8. vs[4] = 0;
  9. srand((unsigned)time( NULL ) );
  10. do {
  11.    for (int i = 0; i < SIZE; i++) {
  12.        vs[i] = rand()%2;
  13.    }
  14. } while(!evalFactibility(vs));
  15. return vs;
  16. }

La función evalFactibility(vs), lo que hace es decirnos si el arreglo q le enviamos es factible o no, es decir si nos sirve o no, lo que hize en Python fue lo siguiente:
Código Python:
Ver original
  1. def getRandomString():
  2.    
  3.     vs=[]*size
  4.  
  5.     vs.insert(0,0)
  6.     vs.insert(1,0)
  7.     vs.insert(2,1)
  8.     vs.insert(3,1)
  9.     vs.insert(4,0)
  10.     from random import randint
  11.  
  12.     while not evalFactibility(vs):
  13.         for i in range(size):
  14.             vs.insert(i,(randint(0,100)%2))
  15.            
  16.     return vs
En otra parte del código C++, tb me encuentro con un do-while y al hacerlo con while se me ha echo un loop infinito, se podrá solucionar esto???
  #6 (permalink)  
Antiguo 26/09/2010, 23:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Multiplicación en listas

Código Python:
Ver original
  1. from random import randint #Esto va afuera de la funcion
  2.  
  3. def getRandomString():
  4.     vs = [0, 0, 1, 1, 0] #[]*size siempre regresara [] asi que no tiene caso
  5.  
  6.     while not evalFactibility(vs): #No se que haga evalFactibility
  7.         vs = [randint(0, 1) for i in xrange(size)]
  8.     return vs
evalFactibility debería de regresar True o False (True si es factible, False de lo contrario)
  #7 (permalink)  
Antiguo 26/09/2010, 23:51
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Multiplicación en listas

Código Python:
Ver original
  1. from random import randint
  2.  
  3. def getRandomString(size):
  4.     #Regresa una lista de tamanio size con 0's y 1's
  5.     return [randint(0, 1) for i in xrange(size)]
  6.  
  7. def evalCoeffs(coeffs, randlist):
  8.     #Asumo que randlist y coeffs tienen el mismo tamanio
  9.     size = len(randlist)
  10.     #Si no llegan a tener el mismo tamanio lanzara una excepcion
  11.     aux = [coeffs[i] * randlist[i] for i in xrange(size)]
  12.     #Regreso la suma de multiplicar los items de coeffs y randlist
  13.     #Y ademas regreso aux, que es multiplicacion de las listas
  14.     return sum(aux), aux
  15.  
  16. def evalFactibility(coeffs, randlist):
  17.     #No tengo idea de que haga evalFactibility
  18.     #Se quede regresar True si cumple con algo
  19.     #Y false si no cumple ese algo
  20.     suma, rlist = evalCoeffs(coeffs, randlist)
  21.     #Supuse que si la suma es mayor o igual a 0 entonces es factible
  22.     #Corrigeme si estoy mal por que no se que es lo hace esta funcion
  23.     if suma >= 0:
  24.         return True
  25.     return False
  26.    
  27.    
  28. def foundInitialSolutions(lcoeffs):
  29.     initialSolutions = []
  30.     for coeffs in lcoeffs:
  31.         size = len(coeffs)
  32.         vs = getRandomString(size)
  33.         while not evalFactibility(coeffs, vs):
  34.             vs = getRandomString(size)
  35.         initialSolutions.append(vs)
  36.     return initialSolutions
  37.  
  38. list_of_coeffs = [
  39.                   [1,   1,  1,  2,  1],
  40.                   [7,   0,  3, -4,  3],
  41.                   [11, -6,  0,  3, -3]
  42.                  ]
  43. inits = foundInitialSolutions(list_of_coeffs)
  44. print list_of_coeffs
  45. print inits

Sigo sin saber BIEN que es lo que hace evalFactibility.
  #8 (permalink)  
Antiguo 27/09/2010, 00:14
 
Fecha de Ingreso: septiembre-2010
Mensajes: 18
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Multiplicación en listas

Si, evalFactibility() devuelve True si es verdadero y False si es falso

Esta es la funcion
Código Python:
Ver original
  1. csize=3
  2. size=5
  3. ops=[1,1,2]
  4. rhs=[4,8,3]
  5.  
  6. def evalFactibility(vs):
  7.     val=[[0]*size for i in range(csize)]
  8.     for i in range(csize):
  9.         aux=[]
  10.         for j in range(size):
  11.             val[i][j]=coeffs[i][j]*vs[j]
  12.             aux.append(val[i][j])
  13.         aux2=sum(aux)
  14.         if ops[i]==1:
  15.             if not(aux2 <= rhs[i]):                
  16.                 return 0 #false
  17.             elif ops[i]==2:
  18.                 if not(aux2 >= rhs[i]):
  19.                     return 0 #false
  20.       return 1 #true
  #9 (permalink)  
Antiguo 27/09/2010, 08:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Multiplicación en listas

Código Python:
Ver original
  1. from random import randint
  2.  
  3. def getRandomString(size):
  4.     #Regresa una lista de tamanio size con 0's y 1's
  5.     return [randint(0, 1) for i in xrange(size)]
  6.  
  7. def evalCoeffs(coeffs, randlist):
  8.     #Asumo que randlist y coeffs tienen el mismo tamanio
  9.     size = len(randlist)
  10.     #Si no llegan a tener el mismo tamanio lanzara una excepcion
  11.     aux = [coeffs[i] * randlist[i] for i in xrange(size)]
  12.     #Regreso la suma de multiplicar los items de coeffs y randlist
  13.     #Y ademas regreso aux, que es multiplicacion de las listas
  14.     return sum(aux), aux
  15.  
  16. def evalFactibility(coeffs, randlist, ops, rhs):
  17.     #No tengo idea de que haga evalFactibility
  18.     #Se quede regresar True si cumple con algo
  19.     #Y false si no cumple ese algo
  20.     suma, rlist = evalCoeffs(coeffs, randlist)
  21.     #Supuse que si la suma es mayor o igual a 0 entonces es factible
  22.     #Corrigeme si estoy mal por que no se que es lo hace esta funcion
  23.     if ops == 1:
  24.         if suma > rhs:
  25.             return False
  26.     elif ops == 2:
  27.         if suma < rhs:
  28.             return False
  29.     return True
  30.    
  31.    
  32. def foundInitialSolutions(lcoeffs, ops, rhs):
  33.     initialSolutions = []
  34.     for coeffs, op, rh in zip(lcoeffs, ops, rhs):
  35.         size = len(coeffs)
  36.         vs = getRandomString(size)
  37.         while not evalFactibility(coeffs, vs, op, rh):
  38.             vs = getRandomString(size)
  39.         initialSolutions.append(vs)
  40.     return initialSolutions
  41.  
  42. list_of_coeffs = [
  43.                   [1,   1,  1,  2,  1],
  44.                   [7,   0,  3, -4,  3],
  45.                   [11, -6,  0,  3, -3]
  46.                  ]
  47. ops = [1, 1, 2]
  48. rhs = [4, 8, 3]
  49. inits = foundInitialSolutions(list_of_coeffs, ops, rhs)
  50. print list_of_coeffs
  51. print inits
Te recomiendo que leas python para todos te ayudara a entender muchas cosas.
  #10 (permalink)  
Antiguo 27/09/2010, 10:19
 
Fecha de Ingreso: septiembre-2010
Mensajes: 18
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Multiplicación en listas

Justamente es el que estoy usando para aprender Python, lo que sí no he podido adentrar mucho, porque esta tarea se trata de pasar un codigo en C++ a Python, por lo que he tenido que buscar cosas puntuales.

De todas maneras, si me puedes recomendar otros textos, una vez que avanze un poco más te estaria agradecida...

Gracias por la ayuda
  #11 (permalink)  
Antiguo 27/09/2010, 10:57
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Multiplicación en listas

Claro que si documentación, turoriales y libros de python nunca faltan.

Te recomiendo que termines python para todos antes de empezar dive into python. Si puedes leerlo en ingles mejor por que la versión en español esta muy recordaba. Y sobre todo practica! sin practica por mas que leas no sabrás como implementar esto o aquello.

Etiquetas: listas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:19.