从文本文件解析到图 (python)

5 投票
3 回答
1609 浏览
提问于 2025-04-17 08:07

我在用Python把一个文本文件解析成图形时遇到了一些麻烦。这个文件的格式如下:

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

文件顶部的整数表示的是维度(行和列)。我需要考虑每个字符之间的空格。这应该表示一个迷宫,我需要在这个迷宫上进行搜索,以确定从起点到终点的最佳路径。这个部分我已经搞定了。我只是需要帮助把这个文本文件解析成一个图形,这样我就可以进行搜索了。

3 个回答

0

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序做一些特定的事情,比如在某个条件下执行某段代码。这个过程就像给程序下达命令一样。

比如说,你可能想要检查一个数字是否大于10,如果是,就打印“这个数字很大”,否则就打印“这个数字不大”。这就是条件判断的基本用法。

在代码中,通常会用一些符号和关键词来表示这些条件,比如“if”(如果)和“else”(否则)。这样,程序就能根据不同的情况做出不同的反应。

希望这个解释能帮助你更好地理解编程中的条件判断!

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

这个应该可以用,但我还没测试过,打算现在去试一下。

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

撰写回答