[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