【问题标题】:Python: How to return a string with a certain formatting for a nested listPython:如何为嵌套列表返回具有特定格式的字符串
【发布时间】:2016-01-30 05:57:21
【问题描述】:

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

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__() 函数来做到这一点,或者我必须求助于使用上面的打印函数?

【问题讨论】:

  • 你必须创建自己的类才能使用__str__()
  • 你的__str__方法需要返回你想要的字符串,而不是打印出来。
  • @Pynchia:BLARGH!停止使用毫无意义的lambdas,尤其是转身并调用可以直接使用的C 内置:'\n'.join(map(' '.join, self.map_))。如果您将lambdamap 一起使用,请不要;它比 Pythonic 的 gen expr 或 list comp 更慢且更长。只有当转换函数是 C 内置函数时,map 才有意义地胜过 list comp/gen expr。

标签: python list-comprehension tostring nested-lists


【解决方案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_])

【讨论】:

  • 谢谢。我现在不在电脑前,但如果它有效,我会接受这个答案(我认为它会)。
【解决方案2】:

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

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

【讨论】:

  • join 的调用中的'[]' 是不必要的。他们创建了一个临时列表,该列表传递给join。如果您不使用它们,则不会创建任何列表,并且内部生成器表达式将照常工作。
【解决方案3】:

比列表理解方法稍微快一些的解决方案,但只有在棋盘尺寸很大时才有意义:

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

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

【讨论】:

  • 地图暂时不会很大,但我可以试试这个。只是一个简单的问题:map() 是做什么的?
  • @jm13fire:这里是the map docs;简洁版本;它接受一个映射函数和可迭代对象,并返回一个新的list,该函数使用每个输入值作为参数调用映射函数的结果。所以在这种情况下,map(' '.join, self.map_) 只是[' '.join(x) for x in self.map_] 的优化版本;优化是因为它缓存函数一次而不是一遍又一遍地加载它,并避免为每个值执行 Python 字节码。在 Py3 中,几乎相同,但它返回一个生成器,而不是 list
  • @jm13fire:一般来说,map 只在极少数情况下使用,特别是当转换函数是用 C 实现的内置函数,而您真的 需要额外的速度(即便如此,它通常只比列表理解节省 10% 左右);如果您曾经考虑将maplambda 函数等一起使用,请停止并使用列表推导,这对于这种情况会更快(通过避免调用函数,列表comp 只是内联直接转换代码)。
【解决方案4】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2016-02-08
    • 2019-12-02
    相关资源
    最近更新 更多