Получение "индекса списка вне диапазона" при попытке создать 2-й список, который добавляется из значений предыдущего списка

В основном мне нужно создать колокольный треугольник значений, основанный на a-list-of-sublists/nested-lists, которые создаются из заданного параметра числа "строк". Я сам буду беспокоиться о форматировании звонка, но я изо всех сил пытаюсь придумать логику для создания вложенного списка. Я не слишком знаком с синтаксисом Python.

поэтому мне нужно сделать так, чтобы первый элемент каждого подсписка (кроме первого подсписка, первый подсписок / строка всегда был просто [1]) в списке rtable - это последний элемент предыдущего подсписка, а каждое последующее значение в этот подсписок является суммой значения предыдущего индекса и значения предыдущего подсписка, который имеет тот же индекс, что и текущий подсписок. так что, если параметр будет 3 ряда, это будет выглядеть

1
1 2
2 3 5

или как список будет выглядеть

[[1], [1, 2], [2, 3, 5]]

вот что у меня так далеко:

def create_list(num_rows):
    rtable = []
    rtable.append([1])

    if num_rows > 1:
        rtable.append([1])

    for i in range(num_rows):
        for j in range(i + 1):
            if i != 0 and j == 0:
                rtable[i].append(rtable[i - 1][-1]) # error here
            else:
                rtable[i].append(rtable[i - 1][j - 1] + rtable[i][j - 1])

    return rtable

первый оператор if существует, чтобы начать вторую строку, если параметр больше 1 строки, так как я знаю, что это начало второй строки. второе if- существует так, чтобы оно добавлялось, если его нет в первом подсписке, где больше ничего не нужно добавлять. ошибка вне диапазона возникает в строке прямо под этим if- . Я не уверен, почему у меня там выходит за пределы диапазона, так как я проверяю, добавляется ли он только в том случае, если подсписок, в котором он находится, не является первым /0-м подсписком, то есть afaik будет работать только в том случае, если он находится в подсписке между вторым и последний подсписок, где он может вернуться и посмотреть на предыдущий подсписок и не быть вне диапазона. также я использую [-1] для доступа к последнему элементу списка, так как я узнал, что это как получить доступ к последнему элементу списка. так что не уверен, что здесь не так. любая помощь будет оценена

2 ответа

Решение

Это работает для меня

def create_list(num_rows):
    r = [[1]]                         # init 0_th row with 1
    for i in range(1, num_rows):      # add num_rows - 1 new rows
        r.append([r[i-1][-1]])        # init new row/list with last element of previous
        for n in r[i-1]:              # get each successive n from previous row
           r[i].append(r[i][-1] + n)  # add each n to the previous num in current row, append 
    return r


create_list(6)

[[1],
 [1, 2],
 [2, 3, 5],
 [5, 7, 10, 15],
 [15, 20, 27, 37, 52],
 [52, 67, 87, 114, 151, 203]]

Комментарии wii для оператора debug print должны помочь с вашим кодом

Вы можете попробовать это:

def triangle(n):
   first = 0
   second = 1
   count = 0
   l = [second]
   for i in range(1, n):
      current_list = []
      for b in range(i-1):
           if count%2 == 0:
               current_list.append(second)
           else:
               current_list.append(first)
           temp1 = second
           second += first
           first = temp1
       l.append(current_list)
       count += 1
   return l


final_data = triangle(5)
new_final_data = [final_data[0]]+final_data[3:]
print(new_final_data)

Выход:

[[1], [1, 2], [2, 3, 5]]
Другие вопросы по тегам