Python:如何为嵌套列表

时间:2016-01-30 05:57:21

标签: python list-comprehension tostring nested-lists

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

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

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

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

O O O
O O O
O O O

我见过这样的例子:

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

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

但是,我希望将其转换为__str__()函数,其中返回' '.join(row)(在每个行元素之间打印一个空格)和'\n'.join(map_)的组合(在两者之间打印换行符)每一行)。

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

有没有办法可以使用__str__()功能执行此操作,还是必须使用上面的打印功能?

4 个答案:

答案 0 :(得分:1)

如何使用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_])

答案 1 :(得分:1)

使用空格连接每个行元素,并使用\n连接每一行

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

答案 2 :(得分:1)

比列表理解方法稍微快一点的解决方案,尽管如果电路板尺寸很大就完全重要:

def __str__(self):
    return '\n'.join(map(' '.join, self.map_))
具有C内置函数的

mapstr.join)可以通过将更多工作推送到CPython参考解释器上的C层,以相当大的优势击败等效列表理解。

答案 3 :(得分:-1)

试试这个:

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