Python - Ayuda con listas

 
Vista:

Ayuda con listas

Publicado por andres alejandro (3 intervenciones) el 16/11/2008 05:59:50
hola a todos necesito ayuda en este lio cuando corro el codigo me sale este error

Traceback (most recent call last):
File "<pyshell#66>", line 1, in <module>
k=a_m("a.txt")
File "C:Documents and SettingsPropietarioEscritorioa_m.py", line 10, in a_m
mat[i][j]=str(f.read(1))
IndexError: list assignment index out of range

el codigo que quiero correr es este

def a_m(a):
#convierte un archivo a matriz
f=open(a,"r")
#iniciar mat
mat=[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
e=1
i=0
j=0
while(e):
mat[i][j]=str(f.read(1))
if mat[i][j]=="*":
i=i+1
j=0
elif mat[i][j]=="f":
e=0
else:
j=j+1
f.close()
return mat

si alguien me pudiera decir que estoy haciendo mal que ya e intentado mucho tiempo y no doy con el problema gracias
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:Ayuda con listas

Publicado por raul (25 intervenciones) el 16/11/2008 10:52:19
hola andres podrias explicar mejor que contiene el archivo txt y que quieres que haga tu programa,su finalidad vaya asi te podremos ayudar mejor y otra cosa podrias poner el codigo identado porque me encuentro mensajes de mucha gente que no identais el codigo y luego si se quiere probar es mas dificil,bueno si quieres escribeme a mi email y te intento ayudar o por aqui ,un saludo andres
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:Ayuda con listas

Publicado por raul (25 intervenciones) el 16/11/2008 12:28:14
Hola andres de nuevo ya encontre cual es el problema y es que cuando intentas leer el siguiente caracter y ese caracter es el fin del archivo se sale del rango de la matriz

te pego tu codigo con la linea que yo he añadido y que lo soluciona:


def a_m(a):
#convierte un archivo a matriz
f=open(a,"r")
#iniciar mat
mat=[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
e=1
i=0
j=0
while e:
mat[i][j]=str(f.read(1))
if mat[i][j]=="": #esta es la linea que añado
break #si se da la condicion sale del bucle
if mat[i][j]=="*":
i=i+1
j=0
elif mat[i][j]=="f":
e=0
else:
j=j+1
f.close()
return mat

la salida que me muestra a mi es la siguiente andres ,en el archivo de texto que he creado escribo en la primera linea esto:1*23 y la salida que muesta:

[['1', '*', 0], ['2', '3', ''], [0, 0, 0], [0, 0, 0]]

Eso es loq ue querias hacer no?
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:Ayuda con listas

Publicado por andres alejandro (3 intervenciones) el 16/11/2008 20:11:31
oie muchas gracias Raul me tenia como loko ese codigo , lo bueno que todavia hay personas buenas en la internet que ayudan jeje oie men tengo una pregunta mas la matriz (bueno lista) que inicializo psss es finita de 4x3 pero me gustaria iniciar una matriz(lista) psss que pudiera aceptar todos los caracteres del archivo que abra... si me explico asi como una lista que se adapte al tamaño del archivo se puede hacer eso???


otra vez gracias y un saludo que estes bien men!
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:Ayuda con listas

Publicado por raul (25 intervenciones) el 16/11/2008 21:02:22
Hola de nuevo andres a mi me gusta ayudar me siento bien y aparte aprendo yo ,no soy ningun experto en python andres pero bueno voy estudiandolo poco a poco ,lo que dices de las listas que se adapten al tamaño del archivo o "infinitas" me lo mirare pero me he dado cuenta tambien de un pequeño inconveniente y es que el ultimo caracter matriz[3][2]
no se rellena y da un error porque el else: j=j+1 hace que j se vaya fuera del rango de la matriz ,lo he solucionado yo lo he probado con lo siguiente en el archivo: 1*23*A*--1- si te fijas hay mas elementos de los que cabrian en la matriz ,el caso es que he cambiado el codigo para que si llega al final de la matriz no aumente J y con un break salga del bucle,para que lo veas claro te pego aqui el codigo final:

def a_m(a):
#convierte un archivo a matriz
f=open(a,"r")
#iniciar mat
mat=[[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
e=1
i =0
j=0
while e:
mat[i][j]=str(f.read(1))
if mat[i][j]=="":
break
if mat[i][j]=="*":
i=i+1
j=0
elif mat[i][j]=="f":
e=0
else:
if j==0 or j==1: #esto es lo que he añadido yo
j=j+1
else: #y esto tambien
break
f.close()
return mat

Te mirare lo de la matriz,saludos andres
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 "infinitas"

Publicado por raul (25 intervenciones) el 17/11/2008 11:01:09
Hola andres me lo estado mirando y este es el codigo que a mi me funciona ,cambia un poco pero funciona bien ,supongo que se podia hacer de alguna otra manera ,no lo he probado,lo de que la lista fuera demasiado grande y hubiese algun problema no lo tengo muy estudiado ,creo que en el manual que estoy leyendo hablan de ello pero todavia no he llegado a ese capitulo,bueno te dejo el codigo,ya me diras que tal:

def a_m(a):
#convierte un archivo a matriz
f=open(a,"r")
#iniciar mat
mat=[0,0,0]
lista=[]
e=1
i=0
while e:
mat[i]=str(f.read(1))
if mat[i]=="":
break
if mat[i]=="f":
e=0
else:
if i==0 or i==1:
i=i+1
else:
lista.append(mat)
mat=[0,0,0]
i=0
f.close()
return lista
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

Publicado por Cyrus (9 intervenciones) el 17/11/2008 14:35:58
No he leido que es exactamente lo que quieres, pero parece que tienes un fichero con numeros, algo como:
3
4
5
2
4
6
4
12

y lo quieres meter en listas del tipo [int,int,int], cierto?

Yo lo que haria seria, leer tres lineas de seguido, para hacer el codigo mas sencillo.

def a_m(a):
__#convierte un archivo a matriz
__f=open(a,"r")
__lista=[]
__while 1:
____int1=str(f.read(1))
____if int1=="":break
____int2=str(f.read(1))
____if int2=="":break
____int3=str(f.read(1))
____if int3=="":break
____lista.append([int1,int2,int3])
__f.close()
__return lista

No lo he probado, seguramente haya que pulir alguna cosa, pero podría servir.
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

Publicado por andres alejandro (3 intervenciones) el 21/11/2008 02:19:06
hola a cyrius y raul gracias por la ayuda pero ahora tengo una nueva pregunta creo que el problema es que al momento de igualar las variables no se pasa el "valor" si no que como quie hace una referencia pues si no prueben el codigo y el argumento qeue le doy ala funcion paso tambien lo altera siendo que solo quiero que me altere la variable local de la funcion "a" no se yo pienso que es algo como poner estatica la variable del argumento pero no se como e estado buscando espero me ayuden gracias

el codigo:

def mov(p,c):
#movimientos 1.-derecha 2.-arriba 3.-izquierda 4.-abajo [c[0][0] (m i) c[1][0] (n j)]

a=c
if p==1:
a[1][0]=a[1][0]+1
return a
elif p==2:
a[0][0]=a[0][0]-1
return a
elif p==3:
a[1][0]=a[1][0]-1
return a
elif p==4:
a[0][0]=a[0][0]+1
return a
else:
print "Movimiento no valido"
return 0

bueno el problema es que lo que quiero es que me altere la "a" y me la regrese alterada si lo hace pero lo que se sale de control es que tambien me altera el argumento de la funcion "c" y pss ese no se tiene que alterar como digo pienso que es que al igualar "a=c" se pasa la direccion de laa variable y no el "dato" y pss por eso se modifican los dos quiero como hacer estatica la variable "c" si alguien sabe me aria un gran favor jj3j3j3 saludos chavales!!!

gracias!
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

Publicado por Cyrus (9 intervenciones) el 21/11/2008 15:43:19
Las variables en python son siempre estáticas dentro de una función, es mas si quisieras poder modificarla, tendrías que usar la función global(), pero si no no se modifica. yo te diría que miraras por otro lado, porque ese código que has puesto no cambia c fuera de la función. solo cambia a.

por ejemplo:
a=1
c=1
def cambiarA(a,c):
a=0
c=0
return a
a=cambiarA(a,c)
print a,c

es un ejemplo, solo cambia a, c se queda =.
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

solucion

Publicado por raul (25 intervenciones) el 21/11/2008 18:17:11
aqui te dejo una posible solucion ya que tienes razon cambia el valor de c:

m=[[0],[0]]
def mov(p,c):
#movimientos 1.-derecha 2.-arriba 3.-izquierda 4.-abajo [c[0][0] (m i) c[1][0] (n j)]

a=[[0],[0]]
if p==1:
a[1][0]=c[1][0]+1
return a
elif p==2:
a[0][0]=c[0][0]-1
return a
elif p==3:
a[1][0]=c[1][0]-1
return a
elif p==4:
a[0][0]=c[0][0]+1
return a
else:
print "Movimiento no valido"
return 0

#esto fuera de la funcion
print m
print mov(1,m)
print m
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

Publicado por maria (2 intervenciones) el 18/06/2009 21:29:59
me podrias decir que hace tu codido raul y darme la definicion de lista infinitas
y todo lo que tenga que ver con la misma
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:Ayuda con listas

Publicado por maria (2 intervenciones) el 18/06/2009 21:25:05
hola a todos les escribo para saber si alguien me puede ayudar con la definicion de listas infinitas en c++ y todo lo que tenga que ver con la misma, al mismo tiempo para saber si me pueden ayudar con todo lo que tenga que ver con listas y recursion.
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