Задача алгебраической пирамиды python — более эффективный способ?

#python

#python

Вопрос:

Я делаю задачу на python, в которой вам нужно создать перевернутую алгебраическую пирамиду на основе списка. Каждый уровень (идущий вниз) должен быть суммой чисел над ним.

Я создал код для этого для 4 слоев.

Задача части 2 заключалась в том, чтобы сделать это для списка любой длины, поэтому я добавил код len (list) для размещения. Вы можете увидеть мой код ниже.

Мне просто интересно, есть ли более эффективный способ сделать это для длинных списков, или мне просто нужно ввести больше кода для оставшихся слоев.

Кроме того, мне было интересно, как оператор return должен вписываться в него (вам дана подсказка, написанная в приведенном ниже коде, для обновления оператора return).

  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)
 

Ответ №1:

Здесь эта функция рассчитает вашу пирамиду с помощью списка:

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

Комментарии:

1. Большое вам спасибо

2. Однако чего я не понимаю (помимо всего прочего!) является ли: len(last_layer) Разве это не всегда будет 1, так как pyramid [i] всегда будет просто одним числом?

3. пирамида[i] — это слой, а в слое есть кирпичи, поэтому len(last_layer) будет подсчитывать количество кирпичей последнего слоя. (Я называю брику номер)

Ответ №2:

Вы можете использовать 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
 

Комментарии:

1. Большое вам спасибо

2. Посмотрев на ваше решение, я понял, что оно слишком продвинуто для понимания. Я пробовал. Например, я не понимаю, почему вы получаете длину суммы списка. В первом списке примеров сумма равна 64 — почему длина 64 имеет значение? Задача была предназначена для относительного новичка, поэтому я подумал, что решение будет простым. Я уверен, что однажды я смогу вернуться к этому и понять.

3. len(str(sum(A))) это просто наивный способ получить представление о размере чисел в пирамиде, чтобы использовать обычную ширину и отступ для целей форматирования. Я мог бы вычислить окончательное число, чтобы получить точный размер, но это казалось немного излишним.