我需要编写一个程序来打印以下模式:

时间:2019-06-12 18:25:23

标签: python-3.x

我需要产生以下图案:

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

我编写了一个代码,它以右上形式生成相同的代码。我不知道如何将其翻转。

for i in range(1, 6 + 1):
    for j in range(1, rows + 1):
        if(j < i):
            print(' ', end = '  ')
        else:
            print(i, end = '  ')
    print()

5 个答案:

答案 0 :(得分:2)

编辑:此有点失败,并且行> = 12,敬请alexanderhurst提及以发现此实现中的错误并提供另一种干净的解决方案。但是,我们可以通过使用制表符(\t)而不是空格来模拟制表(请参见底部)。

为什么没有更简单的东西?

rows = 6
l = list(range(rows))

for i in range(rows):
   print(" " * 2*i + " ".join(str(x) for x in l[:rows-i]))
1 2 3 4 5 6
  1 2 3 4 5
    1 2 3 4
      1 2 3
        1 2
          1

编辑:如果需要排列,请尝试以下操作:

>>> for i in range(rows):
...    x = " " * 2*i + " ".join(str(x) for x in l[:rows-i])
...    print(x[::-1])

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

>>> for i in range(rows, -1, -1):
...    print(" " * 2*i + " ".join(str(x) for x in l[:rows-i]))
... 

          1
        1 2
      1 2 3
    1 2 3 4
  1 2 3 4 5
1 2 3 4 5 6
>>> for i in range(rows, -1, -1):
...   x = " " * 2*i + " ".join(str(x) for x in l[:rows-i])
...   print(x[::-1])
... 

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

显示大量行时显示错误:

>>> rows = 14
>>> l = list(range(rows))
>>> for i in range(rows):
...    print(" " * 2*i + " ".join(str(x) for x in l[:rows-i]))
... 
0 1 2 3 4 5 6 7 8 9 10 11 12 13
  0 1 2 3 4 5 6 7 8 9 10 11 12
    0 1 2 3 4 5 6 7 8 9 10 11
      0 1 2 3 4 5 6 7 8 9 10
        0 1 2 3 4 5 6 7 8 9
          0 1 2 3 4 5 6 7 8
            0 1 2 3 4 5 6 7
              0 1 2 3 4 5 6
                0 1 2 3 4 5
                  0 1 2 3 4
                    0 1 2 3
                      0 1 2
                        0 1
                          0

修补程序1:使用选项卡。如果您的制表符长度与我相同,并且您在最大屏幕宽度上使用了<20行(这样,否则alexanderhurst的解决方案也可能无法解决您的问题),这可以正常工作。

>>> for i in range(rows):
...    print("\t" * i + "\t".join(str(x) for x in l[:rows-i]))
... 
0   1   2   3   4   5   6   7   8   9   10  11  12  13
    0   1   2   3   4   5   6   7   8   9   10  11  12
        0   1   2   3   4   5   6   7   8   9   10  11
            0   1   2   3   4   5   6   7   8   9   10
                0   1   2   3   4   5   6   7   8   9
                    0   1   2   3   4   5   6   7   8
                        0   1   2   3   4   5   6   7
                            0   1   2   3   4   5   6
                                0   1   2   3   4   5
                                    0   1   2   3   4
                                        0   1   2   3
                                            0   1   2
                                                0   1
                                                    0

修补程序2:根据数字长度添加/删除空格(例如,使用log(x)len(str(x))或类似名称),但是它变得太复杂了。

答案 1 :(得分:1)

此解决方案与您类似,但有一些变化
首先打印出三角形所需的空格数
然后最多可以算到count 然后移动到下一行

num = 6
for i in range(num,0,-1):
    print('  '*(num - i), end='')
    for j in range(i):
        print(j + 1, end=' ')
    print()

如果您使用大于10的值,这的确会产生奇怪的影响

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

您可以使用表格将所有内容保留在其栏中。在这里,我还使用列表理解来减小代码大小。
代码:

from tabulate import tabulate
count = 16
numbers = [[''] * (count - i) + [j+1 for j in range(i)] for i in range(count, 0, -1)]
print(tabulate(numbers))

输出:

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

答案 2 :(得分:0)

您可以使用range()向后计数:

for i in range(6, 0, -1):
    for j in range(1, rows + 1):
        if(6-j >= i): # if i = 6, doesn't activate. i=5, activates once. i=4, activates twice, etc.
            print(' ', end = ' ')
        else:
            print(i, end = ' ')
    print()

答案 3 :(得分:0)

因此,据我所知,您正在尝试制作表格:

     1
    21
   321
  4321
 54321
654321

因此循环需要反转,并且需要添加一个空格部分。

rows = 6
for i in range(1, rows+1):
    out = ''
    for j in range(1, rows):
        out += ' '

    for j in range(i, 0, -1):
        out += str(j)
    print(out)

    rows -=1

答案 4 :(得分:0)

使用列表推导的1行语句将是

pattern = '\n'.join((' ' * 2 * i) + ' '.join(str(n) for n in range(1, num + 1)) for i, num in enumerate(range(6, -1, -1)))

为澄清起见,您可以查看以下在Python交互式终端上执行的命令。

>>> pattern = '\n'.join((' ' * 2 * i) + ' '.join(str(n) for n in range(1, num + 1)) for i, num in enumerate(range(6, -1, -1)))
>>> 
>>> print(pattern)                                                                                            
1 2 3 4 5 6
  1 2 3 4 5
    1 2 3 4
      1 2 3
        1 2
          1

>>> 

建议使用功能性方法进行此类重复性工作(如果要尝试使用多个样本)。

def print_num_triangle(n=6):
    """
    1 2 3 4 5 6
      1 2 3 4 5
        1 2 3 4
          1 2 3
            1 2
              1
    """

    pattern = '\n'.join((' ' * 2 * i) + ' '.join(str(n) for n in range(1, num + 1)) for i, num in enumerate(range(n, -1, -1)))
    print(pattern)


if __name__ == "__main__":
    print_num_triangle(10)

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

    print_num_triangle(7)
    # 1 2 3 4 5 6 7
    #   1 2 3 4 5 6
    #     1 2 3 4 5
    #       1 2 3 4
    #         1 2 3
    #           1 2
    #             1

    print_num_triangle() # default -> 6
    # 1 2 3 4 5 6
    #   1 2 3 4 5
    #     1 2 3 4
    #       1 2 3
    #         1 2
    #           1