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 层来击败等效的列表理解。
所以我正在尝试制作一个基于文本的冒险游戏,它有一个使用嵌套列表管理的地图系统,如下所示:
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 层来击败等效的列表理解。