2011-12-10 11 views
5

Tengo problemas para descifrar cómo analizar un archivo de texto en un gráfico en python. El archivo está en el siguiente formato:analizando de archivo de texto a gráfico (python)

4 4 
o . o . o . o 
- - . - 
o . o . o | o 
. - . . 
o | o . o . o 
. - . - 
o . o . o . o 

Los enteros en la parte superior son las dimensiones (fila, columna). Necesito tener en cuenta el espacio entre cada personaje. Se supone que esto representa un laberinto en el que tendré que realizar una búsqueda para determinar la ruta óptima dado un punto de inicio y un punto final. Esa parte que he descubierto. Simplemente necesito ayuda para analizar este archivo de texto en un gráfico para poder ejecutar la búsqueda.

+0

¿A qué se refiere específicamente al analizar un ["gráfico"] (http://en.wikipedia.org/wiki/Graph_%28data_structure%29)? ¿Hay un tipo de "gráfico" incorporado en Python? (Me sale el 'nombre 'gráfico' no está definido'). ¿Es algún tipo personalizado que ha creado? ¿O no tienes ideas específicas y quieres que te sugiera una representación adecuada? –

Respuesta

2

Esta función analiza una cuadrícula como la que ha dado en un conjunto de nodos (almacenados como un par de coordenadas en la cuadrícula original) y un dict de bordes (asignando cada nodo a una lista de nodos que son adyacente a ella). Esta es una representación muy fácil de usar para el gráfico, y no debería tener problemas para codificar la búsqueda de laberinto que la usa. El código utiliza la idea de que la estructura del laberinto se describe solo por los bordes (- y |), y que la cuadrícula tiene una línea doble espaciada horizontal y verticalmente. Un cuadrado sin bordes dentro o fuera de él no aparecerá en el gráfico.

import collections 

def parse_grid(grid): 
    edges = collections.defaultdict(list) 
    for i in xrange(len(grid)): 
     for j in xrange(len(grid[i])): 
      if grid[i][j] == '-': 
       edges[i, j - 2].append((i, j + 2)) 
       edges[i, j + 2].append((i, j - 2)) 
      if grid[i][j] == '|': 
       edges[i - 2, j].append((i + 2,j)) 
       edges[i + 2, j].append((i - 2,j)) 
    nodes = set() 
    for e in edges.iterkeys(): 
     nodes.add(e) 
    return nodes, edges 

grid = """\ 
o . o . o . o 
- - . - 
o . o . o | o 
. - . . 
o | o . o . o 
. - . - 
o . o . o . o""" 
print parse_grid(grid.split('\n')) 
+1

Básicamente codifiqué el mismo y lo publiqué ... luego la página se actualizó y vi que lo hiciste antes que yo ... ¡No hay otra oportunidad que eliminar la mía y la tuya a favor! ;) – mac

0

La implementación dependería de cómo quiera representar el gráfico en Python.

estoy creando una lista de aristas

edgelist = [] 
y=0 
for line in file: 

    chars = [char for char in line.split(" ") if len(char)] 
    x = 0 

    if ('|' in chars): 
     y+=1 
     for char in chars: 
      if char == 'o' 
       x+=1 
      elif char == '.' 
       edgelist.append([(x,y),(x+1,y)]) 
    else: 
     for char in chars: 
      x+=1 
      if char == '.' 
       edges.append([(y,x),(y,x+1)) 

esto debería funcionar, pero yo no te has probado todavía, va a hacer eso ahora.

0
""" 
maze1.txt 

4 4 
o . o . o . o 
- - . - 
o . o . o | o 
. - . . 
o | o . o . o 
. - . - 
o . o . o . o 
""" 

readfile = open('maze1.txt', 'r') 
line = readfile.readline() 
rowcount, colcount = [int(elem) for elem in line.strip().split(' ')] 
rights = [] 
downs = [] 
chars =  ('o', ' ', '.', '-', '|', '') 
translated = ('o', ' ', '.', '-', '|', '') # if needed, could be int or method 

while line: 
    line = readfile.readline() 
    if chars[0] in line: 
     for elem in line.strip().split(chars[0])[1:]: 
      rights.append(translated[chars.index(elem.strip())]) 
    else: 
     for elem in line.strip().split(chars[1])[:colcount]: 
      downs.append(translated[chars.index(elem.strip())]) 


readfile.close() 

for i, elem in enumerate(rights): 
    print elem, divmod(i, colcount) 
print "##" 
for i, elem in enumerate(downs): 
    print elem, divmod(i, colcount) 
Cuestiones relacionadas