ayuda con un problema de python

Chema Cortés ch3m4 en ch3m4.org
Mie Ago 13 10:22:49 CEST 2003


Sonia escribió:
> a ver ahora q tal
> 
> me sale el error de
> 'no module named matrices'
> y si kito esto: from matrices import matriz
> me pide ya el numero (aleluya!!!!)
> pero despues me dice q:   la matriz no esta definida (in english)
> en esta linea:  notas=matriz(n,n)

No conozco ningún módulo 'matrices' en la librería estándar del python. 
Tú sabrás qué hacía este import, pero no necesitas nada más para 
utilizar listas y matrices. Considera que la matriz que vas a utilizar 
no tiene por qué ser cuadrada (o sea, n x n).

Por ejemplo, para inicializar una matriz de n x m se haría:

a=[]
for i in range(n):
     a.append([0.0]*m)

Con compresión de listas:

a=[[0.0]*m for i in range(n)]

Y ojo, esto que pongo a continuación sería erróneo:

a=[[0.0]*m]*n

Te recomiendo que releas el capítulo dedicado a matrices de la 
"Introducción a la programación con python y C" de Andrés Marzal e 
Isabel Gracia.

> bueno te dejo mi nuevo (y ultimo?¿?¿?¿) codigo!!!

Intenta probar mejor el código antes de enviarlo. Hay errores que 
deberías detectar fácilmente. Por lo general, el código ha mejorado mucho:

> #procedimiento q reciba como parametros la matriz,
> #los 2 vectores nif y codigos, y el codigo de la
> #asignatura, y muestre por pantalla el NIF de aquellos
> #estudiantes q hayan obtenido en dicha asignatura una
> #nota superior a la media de la asignatura. Para
> #calcular la media unicamentese deben considerar las
> #notas de los presentados al examen
> from matrices import matriz
> 
> def p1(nif, codigos,notas,codigo_asig):
>   #mira la posicion del codigo_asig en el vector codigos
>   #para saber la columna a recorrer en la matriz
>   cont=0
>   for j in codigos:
>     if codigos[j]==codigo_asig:
>       posic=j #columna a recorrer

Te falta poner un 'break' para terminar el bucle una vez encontrada la 
posición (es algo opcional, pero queda mejor).

> 
>   media=0
>   sum=0
>   cont=0

Es la segunda vez que inicializas 'cont'

>   for i in range (0,len(nif)):
>     # ahora  j es posic:
>       if notas[i][posic]>0: #no presentado y no presentado
>         cont=cont+1 #num de notas
>         sum=sum+notas[i][posic] #suma todas las notas
>   media=sum/cont
> 
> #como se inicializaba el vector q creo?¿?¿?¿
> 
>   for i in range(0,len(nif)) and j==posic:
                                ^^^
Este 'for' no está bien construído (no lo has arreglado).

>     #for j==posic:
>       if notas[i][j]>media:
>         print nif[i]  #lo de [j] spongo q sera error

En lugar de 'j' utiliza 'posic', que ya lo tenías calculado (mira el 
código que te había mandado).

> #escribir un procedimiento q reciba como parametros
> #la matriz de notas y el vector codigos, y muestre por
> #pantalla el codigo de la asignatura q tiene mayor
> #porcentaje de presentados respecto al total de los
> #matriculados
> 
> def p2(notas,codigos):
> 
> #recorro la matriz y hago un vector q pondre el
> #contador de cada columna cuando sean <> -1
> 
>   vcont=[0]*len(codigos)
>   vmatriculas=[0]*len(codigos)
> 
> 
>   for i in range(0,len(nif)):
>     for j in range(0,len(codigos)):
>       if notas[i][j]<>-2: # matriculados
>         vmatriculas=vmatriculas+1

Te has dejado de poner el índice de vmatriculas

>         if notas[i][j]<> -1: # presentados
>           vcont[j]=vcont[j]+1

Este 'if' está mal identado. Debería estar al mismo nivel que el otro if.

>   #ver la posicion q tiene el maximo contador
>   max=0
>   pos=0
>   for i in range(0,len(vcont)):
>     if vcont[i] / vmatriculas[i] >max:
>       max=vcont[i]

'max' debería ser el cociente 'vcont[i]/vmatriculas[i]'
No te aconsejo que utilices 'max' como nombre de variable. 'max()' es 
una función de python que, por cierto, sirve para obtener máximos en una 
lista.

Otro problema, más escondido, pero muy importante es que cuando divides 
enteros te da como resultado un entero, cosa que produce errores de cálculo

1/2 --> 0

Tienes que convertir a 'float' antes de hacer la división:

maximo = float(vcont[i])/float(vmatriculas[i])

>       pos=i
>   print codigo[pos]
> 
> 
> #PROGRAMA PRINCIPAL
> 
> 
> nif=["07525818J","18234590V","10437112X","21334801A"]
> codigos=["IG20","IG02","IG03","IG04","J11"]
> codigo_asig='IG02'
> 
> n=float(raw_input('dime un numero: '))
> notas=matriz(n,n)
> for i in range(0,n):
>     for j in range(0,n):
>         mat[i,j]=int(raw_input('valor de la matriz: '))
                    ^^^
Era aquí donde debías haber puesto 'float', no en el anterior input.

> 
> rdo1=p1(nif, codigos,notas,codigo_asig)
> rdo2=p2(notas,codigos)
> 
> print notas
> print 'Estudiantes con nota superior a la media', rdo1
> print 'Asignatura con mayor porcentaje', rdo2

Este codigo no tiene ya sentido. p1() y p2() no devuelven nada, y los 
prints se hacen dentro de las dos funciones.




Más información sobre la lista de distribución Python-es