如何为代码中的数字0创建一个矩阵?

2024-09-29 19:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,伙计们,我有个作业要画一个给定高度的金字塔。以下是height=2和height=3的示例:

.....         .....
.....         .....
.....         ..x..
..X..         .xxx.
.XXX. n = 2   xxxxx n = 3

这是我正在使用的代码。我的问题是如何让0工作:

heights = [3,4,0,5,2]

def buildPyramid(height):
    base = 2 * height - 1
    grid = []

    if height == 0:
        pass

    else:
        for xnum in range(base, 0, -2):
            # Determine the number of dots
            dots = int((base - xnum)/2)

            # Create new row in the grid
            line = ['.']*dots + ['X']*xnum + ['.']*dots

            # insert new row
            grid.insert(0, line)

        #Add 'sky' rows
        for i in range(5 - height):
            grid.insert(0, ['.']*base)
    return grid

# Print pyramids.
def print_grid(grid):

    # 1. Create all pyramids and add all of them to a list
    # 2. For 5 rows
        # 2b print the row from p0, p1, p2, p3, p4

    for pyr in grid:
        for row in pyr:
            print (" ".join(row))
pyramidList = []

for h in heights:
    pyramidList.append( buildPyramid(h) )

print_grid(pyramidList)

Tags: theinforbasedefgridrowinsert
2条回答

你怎么能建造一个高度为0的金字塔?好吧,你可以简单地输出一个句点网格来表示它没有被填充。为此,您需要处理height==0条件,这只是在代码中传递。下面是它可能的样子:

def buildPyramid(height):
    base = 2 * height - 1
    grid = []
    if height <= 0:  # Handle a negative or zero height.
        # Use a 5x5 grid of emptiness (periods)
        return ['.'*5] * 5
    else:
        for xnum in range(base, 0, -2):
            # Determine the number of dots
            dots = int((base - xnum)/2)
            # Create new row in the grid
            line = ['.']*dots + ['X']*xnum + ['.']*dots
            # insert new row
            grid.insert(0, line)
        #Add 'sky' rows
        for i in range(5 - height):
            grid.insert(0, ['.']*base)
    return grid

执行此操作后,您的输出现在如下所示:

>>> print_grid(pyramidList)
. . . . .
. . . . .
. . X . .
. X X X .
X X X X X
. . . . . . .
. . . X . . .
. . X X X . .
. X X X X X .
X X X X X X X
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . X . . . .
. . . X X X . . .
. . X X X X X . .
. X X X X X X X .
X X X X X X X X X
. . .
. . .
. . .
. X .
X X X

我认为您需要取消插入代码中添加“sky”行的部分,以便无条件地运行它,而不是只针对大于1的高点。然后您只需要修改base变量,使其对于零高度金字塔有一个有意义的值。比如:

def buildPyramid(height):
    grid = []

    if height ==0:
        base = 1                      # added this line, replacing "pass"

    else:
        base = 2 * height - 1         # moved this down a bit

        for xnum in range(base, 0, -2):

            # Determine the number of dots
            dots = int((base - xnum)/2)

            # Create new row in the grid
            line = ['.']*dots + ['X']*xnum + ['.']*dots

            # insert new row
            grid.insert(0, line)

    #Add 'sky' rows
    for i in range(5 - height):                           # unindented these lines
        grid.insert(0, ['.']*base)


    return grid

另一个改进(与零高度问题无关)是更改代码,以便可以使用grid.append(line)而不是grid.insert(0, line)。添加到列表(平均)是一个固定时间操作,而在开始插入时需要复制整个列表。一种可能的解决方案是将列表倒过来构建(简单地用append调用替换insert调用),然后在返回列表之前在末尾反转列表。另一种选择是先添加天空行(使用append),然后使用向上计数而不是向下计数的循环追加金字塔行:for xnum in range(1, base+1, 2)。你知道吗

相关问题 更多 >

    热门问题