ayuda con un problema de python

Chema Cortés ch3m4 en ch3m4.org
Lun Ago 11 13:49:52 CEST 2003


Sonia escribió:
> hola de nuevo!
> he modificado mi programa. a ver si asi ya va mejor.
> mientras voy a hacer el 2) procedimiento

Voy a comentarte algunos detalles. Deberías probar lo que programas 
antes de enviarlo. Es la mejor forma de aprender de tus fallos.


> #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
> 
> def (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 range(0,len(codigos)):
>     if codigos[j]==codigo_asig:
>       j=posic #columna a recorrer

Un primer consejo es que no alteres la variable de control del bucle 
dentro del bucle. Creo que has puesto mal la asignación, que debe ser 
posic=j

También te aconsejo que en los bucles recorras la lista elemento a 
elemento, sin acceder a los elemento a través de variables índices. Esto es:

for c in codigos:
   if c==codigo_asig:
     posic=c
     break  # ya no hace falta seguir mirando

Para para buscar la posición de un elemento te recomiendo utilizar el 
método .index():

posic=codigo.index(codigo_asig)

>   #creo un vector de media
>   #recorro la matriz, para sacar la media de cada
>   #columna y almacenarla al vector
>   sum=0
>   cont=0
>   for i in range (0,len(nif)):
>     for j in range(0,len(codigos):
>       if notas[i][j]<>'-1': #no presentado
>         if notas[i][j]<>'-2':  #no matriculado
>         cont=cont+1 #num de notas
>         sum=sum+notas[i][j] #suma todas las notas
>     media[j]=sum/cont

Aquí tienes mal puestos los if's. Deberías haber combinado los dos:

if notas[i][j]<>'-1' or notas[i][j]<>'-2':
   ...

Pero hay que comentar más cosas. Se suponen que las notas son números 
reales (como ponía el enunciado). Aquí estás comprobando con cadenas de 
texto '-1' y '-2'. Cuida con ésto, ya que siempre siempre te saldrá 
falsa la comparación, puesto que un float y una cadena de caracteres 
nunca serán iguales. Debería ser:

if notas[i][j]<>-1 or notas[i][j]<>-2:
   ...

Aún sería mejor si fuera así:

if notas[i][j]<0:
   ...

Seguimos con las correcciones. Habías encontrado la columna que querías 
comprobar (posic). No lo has tenido en cuenta a la hora de recorrer las 
matriz, por lo que estás comprobando todas las asignaturas. Conociendo 
la columna, con un simple bucle te bastaría (no te pongo el código para 
que lo intentes por tí misma).

También puedes aprovechar la compresión de listas:

notas_asignatura = [n[posic] for n in notas]

Aunque pueder serte complicado ahora mismo (y puede que el profesor no 
quiera que las compresiones de listas), es mejor que te vayas 
acostumbrando con esta característica del python.

> #como se inicializaba el vector q creo?¿?¿?¿
> 
>   for i in range(0,len(nif)):
>     for j==posic:
>       if notas[i][j]>media[j]:
>         print nif[j]
>   #recorrer la matriz de forma notas[][j] no se como es

Como te había dicho, basta con un bucle.

Te pongo la versión con compresión de listas (y python 2.3); pero 
deberías seguir intentándolo como lo venías haciendo hasta ahora:

def (nif, codigos,notas,codigo_asig):
   posic=notas.index(codigo_asig)
   notas_asignatura=[n[posic] for n in notas]
   notas_presentados=[n for n in notas_asignaturas if n>=0]

   media=sum(notas_presentados)/len(notas_presentados)

   for i,n in enumerate(notas_asignatura):
     if n>media:
       print nif[i],n




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