我想知道你是否可以帮助我。我正在尝试在 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
