代数金字塔的python挑战--更有效的方法?

1 人关注

我在做一个Python挑战,你必须根据一个列表创建一个倒置的代数金字塔。每一层(往下)都需要是上面的数字之和。

我创建的代码是为4层做的。

第二部分的挑战是如何对任何长度的列表进行处理,所以我添加了len(list)代码来适应。你可以在下面看到我的代码。

我只是想知道是否有更有效的方法来处理长列表,或者我只需要为剩余的层打出更多的代码。

另外,我想知道返回语句是如何融入其中的(下面的代码中给你写了更新返回语句的提示)。

 def drawPyramid(list):
  layer = ""
  layer2 = " "
  layer3 = "  "
  layer4 = "   "
  for i in range(len(list)):
    layer = layer + " " + str(list[i])
  for i in range(len(list)-1):
    layer2 = layer2 + " " + str(list[i]+list[i+1])
  for i in range(len(list)-2):
    layer3 = layer3 + " " + str(list[i]+(list[i+1]*2)+list[i+2])
  for i in range(len(list)-3):
    layer4 = layer4 + " " + str(list[i]+(list[i+1]*3)+(list[i+2]*3)+list[i+3])
  print(layer)
  print(layer2)                              
  print(layer3)
  print(layer4) 
  #Update this code to generate all 4 layers of the pyramid
  #Update this return statement to return the value of the single brick on the last layer of the pyramid
  return 0
#Main code starts here  
list = [30,12,10,22]
drawPyramid(list)
    
python
Jimmy Coltrane
Jimmy Coltrane
发布于 2021-01-14
2 个回答
Vincent Bénet
Vincent Bénet
发布于 2021-01-14
0 人赞同

在这里,这个函数将使用列表来计算你的金字塔。

def calcul_pyramid(base):
    pyramid = [base]
    for i in range(len(base) - 1):
        actual_layer = []
        last_layer = pyramid[i]
        for j in range(len(last_layer) - 1):
            actual_layer.append(last_layer[j] + last_layer[j + 1])
        pyramid.append(actual_layer)
    return pyramid

这个函数将得到你的金字塔的字符串。

def print_pyramid(pyramid):
    lines = []
    for layer in pyramid:
        line = ""
        for brick in layer:
            line += str(brick)
            line += " "
        lines.append(line)
    pyramid_len = max([len(layer) for layer in lines])
    txt = ""
    for line in lines:
        diff = (pyramid_len - len(line)) / 2
        txt += " " * int(diff + 0.5)
        txt += line
        txt += " " * int(diff - 0.5)
        txt += "\n"
    print(txt)

现在你可以输入你想要的每一个基地,它将工作

print_pyramid(calcul_pyramid([30,12,10,22])))
    
非常感谢您
但我不明白的是(除其他外):len(last_layer) 这不总是1吗,因为pyramid[i]总是只有一个数字?
pyramid[i]是一个层,一个层有砖,所以len(last_layer)将计算最后一层的砖的数量。(我把砖头称为数字)
Alain T.
Alain T.
发布于 2021-01-14
0 人赞同

你可以用zip把数值加起来,那么就只是一个格式化的问题。

def pyramid(A):
    indent = ""
    width  = len(str(sum(A)))
    while A:
        print(indent,*(f"{a:{width}}" for a in A))
        A = [a+b for a,b in zip(A,A[1:])]
        indent += " "*max(1,width-1)

output:

L = [30,12,10,22]
pyramid(L)
 30 12 10 22
  42 22 32
   64 54
L = [30,12,10,22,23,43]
pyramid(L)
  30  12  10  22  23  43
    42  22  32  45  66