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