Получение "индекса списка вне диапазона" при попытке создать 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]]