如何打印以下模式出现空格问题?

How to print following pattern getting issue with spaces?

我正在尝试编写代码,但不知道如何实现预期的输出 导致 space 出现问题,无法正确判断如何在每次迭代后获得准确的 spaces

我的代码:

n=15
cnt=0
lst=[str(' ') for x in range(1,n+1)]
initial_length=len(''.join(lst))
print(initial_length)
for row in range(1,n+1):
  lst[cnt-1]=str(row)
  cnt=cnt-1
  print(' '.join(lst))

以上代码的输出不是预期的输出

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

预期输出:

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

您必须考虑更大的数字占用更多 space,这意味着在创建包含 space 的列表时,您需要将 space 乘以多少数字在那个数字中,你可以通过 len(str(number)):

得到
n = 15

# create a list containing how many spaces each number will take up
# in reverse order because the figure is reverse
lst = [' ' * len(str(x)) for x in range(n, 0, -1)]

# go over each number
for x in range(1, n + 1):
    # replace the digit in its place from end
    # by the string represantion of itself
    lst[-x] = str(x)
    # print joined list
    print(' '.join(lst))

还有:
我强烈建议关注 PEP 8 - Style Guide for Python Code。函数和变量名称应在 snake_case 中,class 中的名称应在 CapitalCase 中。如果用作关键字参数 (func(arg='value')) 的一部分,则 = 周围没有 space,但如果用于 =,则 space 周围赋值 (variable = 'some value')。在运算符周围有 space(+-/ 等:value = x + y(此处除外 value += x + y))。在函数和 class 声明周围有两个空行。对象方法定义周围有一个空行。

另一种近似,通过使用递归函数预先知道空间的数量:

def findDigits(N):
    if N <= 1:
        return N
    # Changing number to string
    s = str(N)
    # Add length of number to total_sum
    return len(s) + findDigits(N - 1)


def print_inverse_pyramid(n):
    # Calculate number of total digits until n
    total_digits = findDigits(n)
    # Print the pyramid
    for row in range(1, n + 1):
        total_digits -= len(str(row))
        l_r = [str(i) for i in range(row, 0, -1)]
        print(" " * (total_digits + (n - row)) + " ".join(l_r))

print_inverse_pyramid(15)

快速而肮脏:'looking' 在最后一行

n = 15

def serie(n):
    return ' '.join([str(j) for j in range(n, 0, -1)])

maxlen = len(serie(n))
for i in range(1, n +1):
    s = serie(i)
    print(" " * (maxlen - len(s)) + s)

通过数学,将长度计算为值的 log10 的整数之和并添加空格

import math

n = 15

def lenserie(n):
    return sum(map(lambda i : int(math.log(i, 10)) + 1 ,range(1, n+1))) + (n-1)

maxlen = lenserie(n)
for i in range(1, n+1):
    print(" " * (maxlen - lenserie(i)) + " ".join([str(i) for i in range(i, 0, -1)]))