What about a recursive function?
list_ = [-100, 1, 3, 5, 7, 100]
matrix_ = []
def matrix(lst):
if not lst:
return
length = len(lst)-1
if length:
matrix_.append(lst[:length])
matrix(lst[:length])
x = matrix(list_)
print(matrix_)
output
[[-100, 1, 3, 5, 7], [-100, 1, 3, 5], [-100, 1, 3], [-100, 1], [-100]]
Then reverse it if you want:
matrix_.reverse()
print(matrix_)
# [[-100], [-100, 1], [-100, 1, 3], [-100, 1, 3, 5], [-100, 1, 3, 5, 7]]
Additional
1. Using a While loop
list_ = [-100, 1, 3, 5, 7, 100]
def matrix(lst):
matrix_ = []
count = 0
prev = []
while count < len(lst)-1:
prev.append(lst[count])
matrix_.append(prev.copy())
count += 1
return matrix_
x = matrix(list_)
print(x)
# [[-100], [-100, 1], [-100, 1, 3], [-100, 1, 3, 5], [-100, 1, 3, 5, 7]]
2. Using Generator Function
list_ = [-100, 1, 3, 5, 7, 100]
def matrix(lst):
matrix_ = []
count = 0
prev = []
while count < len(lst)-1:
prev.append(lst[count])
matrix_.append(prev.copy())
count += 1
yield matrix_
x = list(matrix(list_))
print(x[0])
# [[-100], [-100, 1], [-100, 1, 3], [-100, 1, 3, 5], [-100, 1, 3, 5, 7]]
3. Enumerate
list_ = [-100, 1, 3, 5, 7, 100]
def matrix(lst):
result = []
for idx, _ in enumerate(lst):
if idx:
list_block = lst[:idx]
result.append(list_block)
return result
x = matrix(list_)
print(x)
# [[-100], [-100, 1], [-100, 1, 3], [-100, 1, 3, 5], [-100, 1, 3, 5, 7]]
4. range function
list_ = [-100, 1, 3, 5, 7, 100]
def matrix(lst):
result = []
for i in range(len(lst)):
if i:
list_block = lst[:i]
result.append(list_block)
return result
x = matrix(list_)
print(x)
# [[-100], [-100, 1], [-100, 1, 3], [-100, 1, 3, 5], [-100, 1, 3, 5, 7]]
5. Using itertools takewhile just for fun
from itertools import takewhile
list_ = [-100, 1, 3, 5, 7, 100]
def make_list(item):
matrix = []
for i in range(1, len(item)):
wanted_items = list(takewhile(lambda x: x != item[-i], item))
matrix.append(wanted_items)
matrix.reverse()
return matrix
result = make_list(list_)
print(result)
# [[-100], [-100, 1], [-100, 1, 3], [-100, 1, 3, 5], [-100, 1, 3, 5, 7]]