Skip to main content
 首页 » 编程设计

python之嵌套循环的数字金字塔

2025年05月04日11lvdongjie

我想知道你是否可以帮助我。我正在尝试在 Python 3 中编写一个嵌套的 for 循环,它显示一个看起来像的数字金字塔;

                              1 
                         1    2   1 
                     1   2    4   2   1 
                 1   2   4    8   4   2   1 
             1   2   4   8   16   8   4   2  1 
          1  2   4   8  16   32  16   8   4  2  1 
       1  2  4   8  16  32   64  32  16   8  4  2  1 
    1  2  4  8  16  32  64  128  64  32  16  8  4  2  1 

有人能帮帮我吗?将不胜感激!

这是我目前所拥有的:

col = 1 
 
for i in range(-1, 18, col*2):         
 
    for j in range(1, 0, 1): 
        print("  ", end = "") 
 
    for j in range(i, 0, -2): 
        print(j, end = " ") 
 
    print()    

所以,我只能显示金字塔的一半。

我想我遇到的主要问题是:

如何让输出显示先增加后减少的值(即 1、2、4、2、1)?

请您参考如下方法:

另一种使用列表理解的方法。

始终将问题分解为可消化的 block 。每一行都是其自身的镜像,所以让我们首先处理我们需要的一组数字。

这会生成一个字符串列表,其中包含两个的所有幂

lines = [] 
for i in range(1,9): 
  lines.append([str(2**j) for j in range(i)]) 

但是如果我们只打印这个列表,a) 它只会有一半,b) 它会把数字混在一起。我们需要用空格缓冲数字。幸运的是,对于任何一列来说,最后一行的数字最大,因此:

首先,每行最终需要多长时间(我们稍后需要)以及每列中最长的数字是多少。我们可以在将数字转换为上面的字符串时使用 len。

b = len(lines[-1]) 
buffers = [len(x) for x in lines[-1]] 

现在我拥有打印字符串所需的一切(我们不再使用上面的数字):

所以,对于每一行,找出它有多长,并通过用空字符串填充数组的左侧来将数组扩展到最长行的长度(为此我们仍然假装我们只是打印三角形的左半部分):

for line in lines: 
  l = len(line) 
  line = [" "]*(b-len(line)) + line 

现在缓冲每一行,我们将创建一个新数组,我们将从中打印。通过 zip() 将行和缓冲区结合在一起,我们可以轻松地右对齐 ( String.rjust() ) 数字字符串,扩展到所需的长度。

  out = [] 
  for x,y in zip(line,buffers): 
    out.append(x.rjust(y)) 

请记住,直到现在,我们仍然只是在处理金字塔的左半部分。所以我们获取输出数组,将其反转 (array[::-1]),然后获取除第一个元素之外的所有元素 (array[1:]) 并加入它全部和一个字符串一起打印出来。

  print(" ".join(out+out[::-1][1:])) 

瞧!完成的代码:

lines = [] 
for i in range(1,9): 
  lines.append([str(2**j) for j in range(i)]) 
 
b = len(lines[-1]) 
buffers = [len(x) for x in lines[-1]] 
 
for line in lines: 
  l = len(line) 
  line = [" "]*(b-len(line)) + line 
  out = [] 
  for x,y in zip(line,buffers): 
    out.append(x.rjust(y)) 
  print(" ".join(out+out[::-1][1:])) 

输出:

                   1                  
               1   2  1               
            1  2   4  2  1            
         1  2  4   8  4  2  1         
      1  2  4  8  16  8  4  2 1       
    1 2  4  8 16  32 16  8  4 2 1     
  1 2 4  8 16 32  64 32 16  8 4 2 1   
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1