为了账号安全,请及时绑定邮箱和手机立即绑定

如何确保创建数字金字塔时间距一致(Python)

如何确保创建数字金字塔时间距一致(Python)

慕哥6287543 2023-10-05 16:46:22
我正在尝试用 python 创建一个数字金字塔,这是我到目前为止的代码:for i in range(1, height+1):    for j in range(1, height-i+1):        if j > 9:            print(len(str(j)) * " ", end=" ")        else:            print(" ", end=" ")    for j in range(i, 0, -1):        print(j, end=" ")    for j in range(2, i + 1):        print(j, end=" ")    print()这是输出:                                 1                               2 1 2                            3 2 1 2 3                         4 3 2 1 2 3 4                      5 4 3 2 1 2 3 4 5                   6 5 4 3 2 1 2 3 4 5 6                 7 6 5 4 3 2 1 2 3 4 5 6 7               8 7 6 5 4 3 2 1 2 3 4 5 6 7 8             9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9           10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10         11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11       12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12     13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13   14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 据我所见,代码在高度 <= 9 时工作正常,但一旦输入两位数,对齐就会失败。我还需要确保每个数字之间的间距一致(每个数字之间有一个空格),但我研究过的解决方法涉及添加多个空格。如果有什么需要澄清的地方,请告诉我,并提前感谢您的宝贵时间!
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您可以使用字符串格式来定义字段的固定宽度,并用空格或零填充。


field_len = len(str(height))

for i in range(1, height+1):

    for j in range(1, height-i+1):

        print(" " * field_len, end=" ")

    for j in range(i, 0, -1):

        print(f"{j:{field_len}}", end=" ")

    for j in range(2, i + 1):

        print(f"{j:{field_len}}", end=" ")

    print()

产生


                                           1 

                                        2  1  2 

                                     3  2  1  2  3 

                                  4  3  2  1  2  3  4 

                               5  4  3  2  1  2  3  4  5 

                            6  5  4  3  2  1  2  3  4  5  6 

                         7  6  5  4  3  2  1  2  3  4  5  6  7 

                      8  7  6  5  4  3  2  1  2  3  4  5  6  7  8 

                   9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 

               10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 

            11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 

         12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 

      13 12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 13 

   14 13 12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 13 14 

15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 

并且会根据位数的变化自动调整间距。


这使金字塔的斜率保持不变,尽管内部数字的对齐方式似乎变得更加稀疏,因为它们被填充到两个空间中。


解决方案就是使用当前数字的宽度作为空格数 - 我们可以通过将参数更改为range()打印空格的位置来实现,以实际从高度倒数。


for i in range(1, height+1):

    for j in range(i, height):

        print(" " * len(str(j + 1)), end=" ")

    for j in range(i, 0, -1):

        print(j, end=" ")

    for j in range(2, i + 1):

        print(j, end=" ")

    print()

这会产生一个坡度不均匀但间距均匀的金字塔。


                                  1 

                                2 1 2 

                              3 2 1 2 3 

                            4 3 2 1 2 3 4 

                          5 4 3 2 1 2 3 4 5 

                        6 5 4 3 2 1 2 3 4 5 6 

                      7 6 5 4 3 2 1 2 3 4 5 6 7 

                    8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 

                  9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 

               10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 

            11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 

         12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 

      13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 

   14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 


查看完整回答
反对 回复 2023-10-05
?
MYYA

TA贡献1868条经验 获得超4个赞

为了完整起见,我将提供解决此问题的另一种方法。主要思想是跟踪当前行的长度并使用rjust您想要的任何定界符进行填充(我选择了默认的空白)


height = 16

max_line_len = len(' '.join([str(i) for i in range(height,0,-1)] + [str(i) for i in range(2,height+1)]))

half_max_line_len = int((max_line_len+1)/2)

list_of_nums = [str(1)]

print('creating pyramid...')

for num in range(1, height+1):

    print(' '.join(list_of_nums).rjust(half_max_line_len))

    list_of_nums = [str(num+1)] + list_of_nums + [str(num+1)]

    half_max_line_len += len(str(num+1))+1

输出:


creating pyramid...

                                     1

                                   2 1 2

                                 3 2 1 2 3

                               4 3 2 1 2 3 4

                             5 4 3 2 1 2 3 4 5

                           6 5 4 3 2 1 2 3 4 5 6

                         7 6 5 4 3 2 1 2 3 4 5 6 7

                       8 7 6 5 4 3 2 1 2 3 4 5 6 7 8

                     9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9

                  10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10

               11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11

            12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12

         13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13

      14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14

   15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16


查看完整回答
反对 回复 2023-10-05
  • 2 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信