【问题标题】:Number Pyramid Nested for Loop嵌套for循环的数字金字塔
【发布时间】:2013-10-02 02:53:47
【问题描述】:

我想知道你能不能帮帮我。我正在尝试在 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)?

【问题讨论】:

  • 您能否向我们展示您当前的代码并解释什么不起作用?
  • 这就是我所拥有的一切。如果我发布了我一直在使用的任何代码,你可能会把我赶出这个论坛
  • 这样不行。显示您的代码可以帮助您和我们了解您尝试了什么以及您在哪里犯了错误。
  • 感激不尽!下面所有的看起来都很棒!

标签: python python-3.x for-loop


【解决方案1】:

使用列表推导的另一种方式。

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

这会生成一个字符串列表,其中包含 2 的所有幂,这就是它正在生成的内容

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

【讨论】:

    【解决方案2】:
    height = 8
    maxHeight = height - 1
    for i in range(height):
        k, Max = 1, i * 2 + 1
        print(maxHeight * "     ", end="")
        maxHeight -= 1
        for j in range(Max):
            print("%5d" % k, end="")
            if (j < (Max // 2)):
                k *= 2
            else:
                k //= 2
        print()
    

    输出:

                                       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
    

    【讨论】:

    • 你能帮我理解一下“k”到底是怎么回事吗?我不确定我遵循的是什么; print("%5d" % k, end="") 行正在做。
    • k 会递增直到达到峰值,然后递减直到结束。 print 行的 %5d 就像 C 的 printf 的格式说明符。也就是说打印这个数字需要5个字符。如果数字少于 5 个字符,剩余的字符将用空格填充。
    【解决方案3】:

    这可能是其他 9 行解决方案。

    • 将二进制数的幂作为级数生成
    • 找到每行需要添加的偏移量
    • 在打印回文列表之前打印每一行的空白区域。
    • 即。 (offset * (n - i)) 乘以 " "(空格)
    • 通过切片操作构建回文序列,即。温度 + 温度[::-1][1:]
    • 打印回文序列和相对于您要打印的数字长度的偏移空间。

    代码:

    n = 8
    numbers = [2**x for x in range(n)]                 # Generate interseted series.
    offset = len(str(numbers[-1:])) -1                 # Find the max offset for the tree.
    for i in range(1, n+1):                            # Iterate n times. 1 to n+1 helps eazy   slicing.
      temp = numbers[:i]                               # Slice series to get first row numbers.
      print(' ' * (offset * (n - i)), end=" ")         # Prefix spaces, multiples of offset.
      for num in temp + temp[::-1][1:]:                # Generate palindromic series for the row.
        print(num, end=" " * (offset - len(str(num)))) # Adjust offset for the number.
      print('')
    

    输出:

                                 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   
    

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多