![](/img/trans.png)
[英]How to code a two dimensional triangular list in python with the formula of i**2 + j**2?
[英]How do I print a list in a triangular shape in python?
我有一個代碼可以生成一個值列表以形成一個 Romberg 三角形。 該列表始終為三角形長度(3、6、10、15)。 如何以三角形形式打印這樣的列表?
我目前擁有的:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
打印我想要的聲明:
1
2 5
3 6 8
4 7 9 10
嘗試這個:
def getLength(n):
i = 1
s = 1
while ( s < n ):
i += 1
s = s + i
return i
def printTriangle(a):
l = len(a)
lt = getLength(l)
for i in range(lt):
d = lt - 2
s = 0
for j in range(i+1):
print(a[i+j+s], end=' ')
s += d
d -= 1
print('')
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
printTriangle(a)
getLength
function 只計算三角形的高度,而printTriangle
function 處理實際的打印邏輯。
另一種方法:
def print_tri(l):
n_rows = 1
n_elements = 1
while n_elements < len(l):
n_rows += 1
n_elements += n_rows
rows = [[] for _ in range(n_rows)]
offset = 0
while l:
for d in range(offset, n_rows):
rows[d].append(l.pop(0))
offset += 1
for row in rows:
print(' '.join(map(str, row)))
print_tri([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
可以go全數學,求解length=(n*(n+1))/2
為n
(行數和列數,有一個正解),然后用等差數列之和計算索引列(下面的舊變體使用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]
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)])
以下工作相當有效:
def print_triangle(x):
it = iter(x)
num = 0
while True:
val = next(it, None)
if val:
print(val, *(next(it) for _ in range(num)))
num += 1
else:
break
>>> print_triangle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
1
2 3
4 5 6
7 8 9 10
>>> print_triangle([1, 2, 3, 4, 5, 6])
1
2 3
4 5 6
如果輸入的長度不正確,將失敗:
>>> print_triangle([1, 2, 3, 4, 5])
1
2 3
Traceback (most recent call last):
File "<stdin>", line 7, in <genexpr>
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in print_triangle
RuntimeError: generator raised StopIteration
我用了很多數學! n
是三角形的邊(我使用delta 方程來計算)。 l
是您可以提供給 function 的數字列表。 我希望 rest 可以理解。! 隨時在評論中提問。
def print_triang(l):
lg = len(l)
number_of_rows = int(((1+8*lg)**.5 - 1) / 2)
for row_index in range(number_of_rows):
print(' '.join(
str(l[x]) for x in [row_index + col_index*number_of_rows - int(col_index*(col_index+1)/2) for col_index in range(row_index+1)]
))
您還可以將next
與iter
一起使用:
def is_side(d, s):
return not d if not s else is_side(d[s:], s-1)
def to_triangle(d):
new_d, r = iter(d), [i for i in range(len(d)) if is_side(d, i)][0]
s = [[next(new_d) for _ in range(i)] for i in reversed(range(1, r+1))]
return '\n'.join(' '.join(str(b[x]) if (x:=len(b) - len(s[0])+i) >= 0 else ' ' for b in s) for i in range(len(s[0])))
d = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(to_triangle(d))
Output:
1
2 5
3 6 8
4 7 9 10
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.