Python:如何 return 具有特定格式的字符串用于嵌套列表

Python: How to return a string with a certain formatting for a nested list

所以我正在尝试制作一个基于文本的冒险游戏,它有一个使用嵌套列表管理的地图系统,如下所示:

self.map_ = [
    ['O', 'O', 'O'],
    ['O', 'O', 'O'],
    ['O', 'O', 'O']
]

我将地图放在一个名为 Map() 的 class 中,它具有创建地图、添加和更改单元格等功能。

但是,我不确定如何打印地图。我想创建一个 __str__() 函数来打印地图,但我不确定该怎么做。我希望它像这样打印出来,用 spaces 分隔 X 轴上的元素,用换行符分隔 Y 轴:

O O O
O O O
O O O

我见过这样的例子:

for row in map_:
    print ' '.join(row)

...此示例以我想要的格式打印地图。

但是,我想把它变成一个 __str__() 函数,它 returns 是 ' '.join(row) 的组合(在每个行元素之间打印 space )和'\n'.join(map_)(在每行之间打印一个换行符)。

当然,我希望元素的顺序正确(打印视图的左上角对应 map_[0][0] 等)。

有什么方法可以使用 __str__() 函数来实现,还是我必须求助于使用上面的打印函数?

试试这个:

class Map:
    def __init__(self):
        self.map_ = [
            ['O', 'O', 'O'],
            ['O', 'O', 'O'],
            ['O', 'O', 'O']
        ]

    def __str__(self):
        string = ""
        for i in self.map_:
            for j in i:
                string += j + " "
            string += "\n"
        return string

    def change(self, x, y): # For change correctly invert the order
        self.map_[y][x] = "A" 

def main():
    mapa = Map()
    print(mapa)

if __name__ == '__main__':
    main()

怎么样,使用 list comprehension

"\n".join([" ".join(row) for row in map_])

例如:

In [1]: map_ = [
   ...:     ['O', 'O', 'O'],
   ...:     ['O', 'O', 'O'],
   ...:     ['O', 'O', 'O']
   ...: ]

In [2]: print "\n".join([" ".join(row) for row in map_])
O O O
O O O
O O O

为了更直接地回答您关于使用 __str__() 的问题:

def __str__(self):
    return "\n".join([" ".join(row) for row in self.map_])

使用space连接每一行元素,使用\n连接每一行

def __str__(self):
    return "\n".join([" ".join(x) for x in self.map_])

解决方案比列表理解方法稍微快一些,但只有在电路板尺寸很大的情况下才有意义:

def __str__(self):
    return '\n'.join(map(' '.join, self.map_))

map 带有 C 内置函数(str.join 是)可以通过将更多工作推到 CPython 参考解释器上的 C 层来击败等效的列表理解。