(Python)从文件创建二维列表(映射)

时间:2014-11-19 00:10:55

标签: python list 2d

所以我试图让我的程序读取文本文件的元素,然后使用文本文件的元素创建一个20x30的二维列表。我的预期结果基本上是一个游戏地图,我可以在其中找到某些元素并根据需要移动它们。

我到目前为止尝试这样做的两个功能如下,但我似乎无法做到我想要它做的事情,我有点难过为什么我能做到'吨。

def create_level(level):
     """ Create the level based off of reading positions of agents, player, buildings
water, etc..."""

     a_maze = []

     level_data = level.read()
     for r in range (0, ROWS, 1):
        a_maze.append ([])
        for c in range (0, COLUMNS, 1):
             a_maze[r].append (level_data)
     print(a_maze)



def load_level():
     while True:
          print("Enter the name/directory of the level file you wish to load\
     .txt or .lvl are the only accepted formats")

          level_in = input(">>: ")
          if (level_in.endswith(".txt") or level_in.endswith(".lvl")):
               try:
                    level = open(level_in, "r")

               except IOError:
                    print("Not a valid file")
          else:
               print("Not a suitable format for level")

          return level

1 个答案:

答案 0 :(得分:2)

这里你缺少的是解析文件。 python中的所有open都会创建一个文件对象(在本例中为文本文件对象),您可以读取或写入该对象。假设地图中的每个图块都是一个单独的字符,并且每一行都是地图的整个宽度,以下是逐行构建地图的方法:

your_map = []
with open(level_in, 'r') as level:
    for line in level:
        your_map.append([a for a in line.split()])

编辑:如果地图文件之间没有任何分隔符,只需将追加行更改为:

your_map.append(list(line))

Padraic Cunningham还建议your_map作业可以进一步浓缩,使用分隔符:

your_map = [line.split(your_delimiters) for line in level]

或者像这样,没有分隔符:

your_map = [list(line) for line in level]

这两个都可以完全消除对for循环的需求。

一些注意事项:

with关键字用于在完成文件对象后自动销毁文件对象 - 这比你记得调用level.close()后更容易,更安全。完成。

for line in level逐行遍历文件对象,在到达文件末尾时自动结束。

[a for a in line.split]是一个列表理解,但在这种情况下归结为你正在创建一个新列表,其中每个索引都是行字符串中的一个非空格标记。

我上面写的这段代码做了几个假设 - 首先,你的文本文件在每一行中具有相同数量的瓦片,其次,每个瓦片由前一个瓦片用空格分隔。这是我想象的一个例子:

` ` ` o # ` . . .
` ` o # # # . . .
` o # # # # # . .

任何给定的角色对应于沙漠,水等等。