Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
代数金字塔python挑战-更有效的方法?_Python - Fatal编程技术网

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

代数金字塔python挑战-更有效的方法?,python,Python,我正在做一个python挑战,你必须根据列表创建一个倒置的代数金字塔。每个级别(向下)都需要是其上方数字的总和 我为4层创建了这样做的代码 第2部分的挑战是对任意长度的列表执行此操作,因此我添加了len(list)代码以适应。你可以在下面看到我的代码 我只是想知道是否有一种更有效的方法来处理长列表,或者我只需要为其余的层键入更多的代码 另外,我想知道return语句是如何适应它的(下面的代码中给出了更新return语句的提示) 此函数将使用列表计算您的金字塔: def calcul_pyrami

我正在做一个python挑战,你必须根据列表创建一个倒置的代数金字塔。每个级别(向下)都需要是其上方数字的总和

我为4层创建了这样做的代码

第2部分的挑战是对任意长度的列表执行此操作,因此我添加了len(list)代码以适应。你可以在下面看到我的代码

我只是想知道是否有一种更有效的方法来处理长列表,或者我只需要为其余的层键入更多的代码

另外,我想知道return语句是如何适应它的(下面的代码中给出了更新return语句的提示)


此函数将使用列表计算您的金字塔:

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])))

您可以使用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)
输出:

L = [30,12,10,22]
pyramid(L)

 30 12 10 22
  42 22 32
   64 54
    118


L = [30,12,10,22,23,43]
pyramid(L)

  30  12  10  22  23  43
    42  22  32  45  66
      64  54  77 111
       118 131 188
         249 319
           568

非常感谢,但我不明白的是:len(最后一层)不总是1,因为金字塔[I]总是一个数字吗?金字塔[I]是一个层,一个层有砖,所以len(最后一层)会计算最后一层的砖数。(我给brick打了个电话)非常感谢您查看了您的解决方案,它太先进了,我无法理解。我试过了。比如,我不明白为什么你会得到列表总和的长度。在第一个示例列表中,总和是64-为什么64的长度相关?这项挑战的目的是要成为一个相对初学者,所以我认为解决方案会比较简单。我相信有一天我会回到这个问题上来并理解它。
len(str(sum(A))
仅仅是一种简单的方法,可以了解金字塔中数字的大小,以便使用规则的宽度和缩进进行格式化。我本可以计算出最终的数字来得到确切的尺寸,但这似乎有点过分了。
L = [30,12,10,22]
pyramid(L)

 30 12 10 22
  42 22 32
   64 54
    118


L = [30,12,10,22,23,43]
pyramid(L)

  30  12  10  22  23  43
    42  22  32  45  66
      64  54  77 111
       118 131 188
         249 319
           568