Python:如何为嵌套列表返回具有特定格式的字符串

Python:如何为嵌套列表返回具有特定格式的字符串,python,list-comprehension,tostring,nested-lists,Python,List Comprehension,Tostring,Nested Lists,所以我尝试制作一个基于文本的冒险游戏,它有一个使用嵌套列表管理的地图系统,如下所示: self.map_ = [ ['O', 'O', 'O'], ['O', 'O', 'O'], ['O', 'O', 'O'] ] 我在一个名为map()的类中拥有映射,该类具有创建映射、添加和更改单元格等功能 但是,我不知道如何打印地图。我想创建一个\uuuu str\uuuu()函数来打印地图,但我不确定怎么做。我希望它像这样打印出来,用空格分隔X轴上的元素,用换行符分隔Y轴: O

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

self.map_ = [
    ['O', 'O', 'O'],
    ['O', 'O', 'O'],
    ['O', 'O', 'O']
]
我在一个名为
map()
的类中拥有映射,该类具有创建映射、添加和更改单元格等功能

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

O O O
O O O
O O O
我见过这样的例子:

for row in map_:
    print ' '.join(row)
…此示例以我想要的格式打印地图

但是,我想将其转换为一个
\uu str\uu()
函数,其中它返回
'.join(row)
(在每个行元素之间打印一个空格)和
'\n.join(map)
(在每行之间打印一个换行)的组合

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

有没有办法用
\uu str\uuu()
函数实现这一点,或者我必须使用上面的打印功能?

尝试以下方法:

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()
这个怎么样,用一个铅笔

例如:

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
要更直接地回答您关于使用
\uuu str\uuu()
的问题:


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

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

略快于列表理解方法的解决方案,尽管只有当电路板尺寸很大时才有意义:

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

使用C内置函数(它是
str.join
is)可以通过在CPython引用解释器上向C层推送更多的工作来击败等效的列表理解。

您必须创建自己的类才能使用
\uuuuuu str\uuuuu()
您的
\uuuu str\uuuu
方法需要返回您想要的字符串,不要打印它。@Pynchia:BLARGH!停止使用毫无意义的
lambda
s,尤其是只需转身调用一个可以直接使用的C内置函数:
'\n'.join(map(''.join,self.map))
。如果将
lambda
map
一起使用,请不要使用;它比一个更具Pythonic风格的genexpr或list comp更慢、更长。只有当转换函数是C内置函数时,
map
才能有意义地胜过list comp/gen expr。对
join
的调用中的“[]”是不必要的。它们创建了一个临时列表,该列表被传递给
join
。如果不使用它们,则不会创建任何列表,并且内部生成器表达式也会使用相同的表达式。谢谢。我现在不在电脑前,但如果这个答案有效的话,我会接受的(我想会的)。地图现在不会太大,但我可以试试这个。只是一个简单的问题:map()做什么?@jm13fire:;短版本;它接受一个映射函数和一个iterable,并返回一个新的
列表
,其中列出了使用每个输入值作为参数调用映射函数的结果。因此,在本例中,
map(''.join,self.map)
只是self.map中x的
[''.join(x)的优化版本。
;优化是因为它缓存函数一次,而不是反复加载函数,并避免对每个值执行Python字节码。在Py3中,它几乎是一样的,但是它返回一个生成器,而不是
列表
@jm13fire:一般来说,
map
只在极少数情况下使用,特别是当转换函数是用C实现的内置函数时,您确实需要额外的速度(即使是这样,它通常只比清单理解节省大约10%);如果您考虑使用<代码> map < /COD>使用<代码> lambda < /Cuff>函数,请停止,并使用列表理解,这样的场景会更快。(通过避免调用函数,list comp只直接内联转换代码)。
def __str__(self):
    return "\n".join([" ".join(x) for x in self.map_])
def __str__(self):
    return '\n'.join(map(' '.join, self.map_))