[Python-es] Re: String to List....
Inigo Aldazabal Mensa
inigo_aldazabal en ehu.es
Vie Abr 4 21:55:36 CEST 2008
El Viernes, 4 de Abril de 2008 17:18, escribió:
> Si bien el script ahora hace lo siguiente abre un archivo y lo lee
> dentro de el existen filas con valores (0), asignando esta nueva matriz
> a la variable "a" escrita gracias a la ayuda facilitada lo que hago es
> cada elemento que se encuentre en la matriz 20*20 y que sea (0) sea
> recalculado tomando el valor del elemento una fila anterior y una
> posterior ...si bien funciona lo que se prentende es escribir este mismo
> resultado que solo se muestra en la pantalla a un archivo (datos_1b.asc)
> pero bajo el mismo formato del inicial datos_1a.
>
> Muchas gracias...
>
> Juan Luis...
>
> PD; Adjunto el archivo datos_1a.asc
> ===========================
> import os
> import string
> os.chdir(r'\\Pruebas....')
> data_file = open ('datos_1a.asc', 'r')
> data = data_file.readlines()
>
> matrix = []
> for line in data:
> aux = [ int(i) for i in line.split() ]
> matrix.append(aux)
> print 'esta es la nueva matriz'
> print matrix
> a=matrix
> for s in a:
> for m in s:
> if m == 0:
> a[a.index(s)][s.index(m)] = (a[a.index(s)-1][s.index(m)] +
> a[a.index(s)+1][s.index(m)])/2 print 'esta es la matriz cambiada'
> print a
> data_file.close()
>
En primer lugar, ten cuidado porque como lo haces, a no es una copia de la
matriz, es un alias. Si modificas a se modifica también la matriz (prueba
en el intérprete "a is matriz"). Si quieres que sean distintos tendrías
que hacer:
a = matriz[:][:]
o
import copy
a = copy.copy(matriz)
Por otro lado, index te devuelve el índice del *primer* elemento con ese
valor, que en general no es el que quieres. Para eso utiliza enumerate,
que te da el índice, y el valor:
for i, s in enumerate(a):
for j, m in enumerate(s):
if m == 0:
a[i][j] = (a[i - 1][j] + a[i + 1][j] ) / 2
¡ojo si la suma es impar, porque al ser enteros te redondeará!
De todas formas yo lo que haría sería obtener al principio las dimensiones
de la matriz y trabajar directamente con índices. Cosa no muy pitónica,
pero en fin, cuando tienes una matriz y trabajas sobre ella barriéndola,
no he encontrado otra forma fácil de hacerlo, así que se aceptan
sugerencias.
Algo como, si "mide" n x m:
for i in range(n):
for j in range(m):
if a[i][j] == 0:
...
Para escribir la matriz, una forma sería:
out_file = open ( 'data.out' , 'w')
for fila in matriz:
for n in fila:
out_file.write(str(n)+'\t')
out_file.write('\n')
out_file.close()
Si a alguien se le ocurre una forma mas compacta se agradecerá, ya que
nunca he tenido claro como hacerlo "bien" (creo ;-)
Con numpy todo es mas "natural", eso sí.
Un saludo.
Más información sobre la lista de distribución Python-es