One can go full-math, solving length=(n*(n+1))/2 for n (number of rows and columns, it has one positive solution), and then use the sum of arithmetic progression for calculating indices for the columns (what the older variant below does using sum):
def tri(lst):
rows=int(((1+8*len(lst))**0.5-1)/2)
for row in range(0,rows):
print([lst[int(row+(2*rows-column-1)*column/2)] for column in range(0,row+1)])
print() # this is just for separating subsequent calls
tri([1])
tri([1,2,3])
tri([1,2,3,4,5,6])
tri([1,2,3,4,5,6,7,8,9,10])
tri([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
Output:
[1]
[1]
[2, 3]
[1]
[2, 4]
[3, 5, 6]
[1]
[2, 5]
[3, 6, 8]
[4, 7, 9, 10]
[1]
[2, 6]
[3, 7, 10]
[4, 8, 11, 13]
[5, 9, 12, 14, 15]
An older variant collecting column-lengths first, and then indexing into the list directly:
a=list(range(1,11))
lena=len(a)
deltas=[]
total=0
i=0
while total<lena:
deltas.append(i)
i+=1
total+=i
lend=len(deltas)
for row in range(lend):
print([a[row+sum(deltas[lend-column:])] for column in range(0,row+1)])