2011-12-10 12 views
5

Non riesco a capire come analizzare un file di testo in un grafico in python. Il file è nel seguente formato:analisi dal file di testo al grafico (python)

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

I numeri interi nella parte superiore sono le dimensioni (riga, colonna). Devo prendere in considerazione lo spazio tra ogni personaggio. Questo suppone di rappresentare un labirinto sul quale dovrò eseguire una ricerca per determinare il percorso ottimale dato un inizio e un punto finale. Quella parte che ho capito. Ho semplicemente bisogno di aiuto per analizzare questo file di testo in un grafico, così posso eseguire la ricerca.

+0

Cosa si intende in particolare con l'analisi di un "" grafico "] (http://en.wikipedia.org/wiki/Graph_%28data_structure%29)? Esiste un tipo "grafico" integrato in Python? (Ho il 'nome' grafico 'non definito'). È un tipo personalizzato che hai creato? O non hai idee specifiche e vuoi che suggeriamo una rappresentazione adeguata? –

risposta

2

Questa funzione analizza una griglia come quella che è stata assegnata a un set di nodi (memorizzata come una coppia di coordinate nella griglia originale) e una porzione di bordi (mappando ciascun nodo a un elenco di nodi che sono adiacente ad esso). Questa è una rappresentazione molto facile da usare per il grafico e non dovresti avere problemi a codificare la ricerca del labirinto che la usa. Il codice usa l'idea che la struttura del labirinto sia descritta solo dai bordi (- e |), e che la griglia sia doppiamente distanziata orizzontalmente e verticalmente. Un quadrato senza bordi dentro o fuori non apparirà nel grafico.

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

Fondamentalmente ho scritto lo stesso e postato ... poi la pagina è stata aggiornata e ho visto che l'hai fatto prima di me ... Non c'è altra possibilità che cancellare il mio e prolungare il tuo! ;) – mac

0

L'implementazione dipenderà dal modo in cui si desidera rappresentare il grafico in Python.

Sto creando una lista bordo

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)) 

questo dovrebbe funzionare, ma io havn't ancora testato, andando a farlo ora.

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)