Python 如何在网格(嵌套列表)中绘制一行字符

Python 如何在网格(嵌套列表)中绘制一行字符,python,nested-lists,Python,Nested Lists,给定一个w x h大小的网格,按以下方式生成 self.grid = [ ['-'] * self.w ] * self.h 我希望在所述网格的两点之间“画”一条字符“线”。下面的代码就是我想到的 def line( self, char, (x1, y1), (x2, y2) ): self.point( char, (x1, y1) ) x = x1 + cmp( x2, x1 ) y = y1 + cmp( y2, y1 ) while x != x2

给定一个w x h大小的网格,按以下方式生成

self.grid = [ ['-'] * self.w ] * self.h
我希望在所述网格的两点之间“画”一条字符“线”。下面的代码就是我想到的

def line( self, char, (x1, y1), (x2, y2) ):
    self.point( char, (x1, y1) )

    x = x1 + cmp( x2, x1 )
    y = y1 + cmp( y2, y1 )
    while x != x2 or y != y2:
        self.point( char, (x, y) )
        x = x + cmp( x2, x )
        y = y + cmp( y2, y )

    self.point( char, (x2, y2) )
其中point()函数只是用char填充网格中的一个点

这就像是直线和完美对角线的魅力。它也适用于“弯曲”的线条,从某种意义上说,它不会抛出错误,但它并不完全像两点之间的线条,更像。。。我不知道,曲棍球棒

例如,给定10x7网格和调用

line( 'X', (1,1), (5,9) )
我明白了

我想要的可能更像

----------
-X--------
---X------
-----X----
-------X--
---------X
----------
我如何做到这一点,而不是打破它的直线和完美的对角线的过程中?我是否需要两段不同的代码来处理这两种情况,或者一种算法可以同时处理这两种情况?

如果你坚持自己编程,你应该使用。此外,要小心初始化网格,如下所示:

grid = [ ['-'] * self.w ] * self.h
由于使用了相同列表的
self.h
副本:

grid = [ ['-'] * 3 ] * 3 
grid[0][0] = 'X'
print grid
# [['X', '-', '-'], ['X', '-', '-'], ['X', '-', '-']]
使用

或者换成Numpy数组

grid = [ ['-'] * 3 ] * 3 
grid[0][0] = 'X'
print grid
# [['X', '-', '-'], ['X', '-', '-'], ['X', '-', '-']]
grid = [['-'] * self.w for ignored in xrange(self.h)]