2011-12-10 138 views
5

我无法搞清楚如何解析文本文件导入Python中的图表。该文件采用以下格式:分析曲线图(蟒蛇)

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

顶部的整数是维(行,列)。我需要考虑每个角色之间的空间。这是假设代表一个迷宫,我就必须运行搜索,以确定给定起点和终点的最优路径。我已经想出了这部分。我只需要帮助解析这个文本文件到一个图表,所以我可以运行搜索。

+0

你是指通过解析为[“图形”](http://en.wikipedia.org/wiki/Graph_%28data_structure%29)而具体指什么? Python中是否有“图形”内置类型? (我没有定义'name'图表')。它是否是您创建的一些自定义类型?或者你有没有任何具体的想法,你想我们建议一个合适的代表? –

回答

2

本函数解析等你给到一组节点(存储为一对在原始网格坐标的)中的一个,和边缘的一个字典(每个节点映射到那些节点的列表的网格毗邻它)。这是一个非常易于使用的图形表示,您应该可以毫无困难地使用它来编写迷宫搜索。该代码使用迷宫的结构仅由边缘( - 和|)描述的想法,并且网格是水平和垂直双线间隔的。没有任何边缘的正方形不会出现在图形中。

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

我基本上编码相同,并张贴...然后页面刷新,我看到你在我面前做了...没有其他机会,删除我的并upvote你的! ;) – mac

0

该实现将取决于您想如何在Python中表示图形。

我创建一个边列表

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

这应该工作,但是我没有带测试它,但要做到这一点了。

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)