如何在Python中以三角形的形式打印列表?

4

我有一段代码,可以生成值的列表,以形成一个龙贝格三角。该列表始终具有三角形长度(3、6、10、15)。我如何以三角形形式打印这样的列表?

目前我拥有的:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我想要的打印语句:

1 
2 5 
3 6 8
4 7 9 10

你能给我们展示另一个示例列表和预期输出吗? - George Bou
6个回答

2

试试这个:

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 函数只计算三角形的高度,printTriangle 函数处理实际的打印逻辑。


当您添加一个额外的列表元素时,会出现错误。 - Hamidreza
1
@Hamidzreza 嗯,是的,根据问题所述,元素应该始终为3、6、10、15。 - MD.Tabish Mahfuz

1
另一种方法:

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])

1

您可以全面地运用数学知识,解决 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])

输出:

[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)])

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

1
我已经使用了很多数学!n是三角形的边长(我使用delta方程计算)。l是您可以提供给函数的数字列表。希望其余内容易于理解!如有问题,请在评论中提问。
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)]
    ))

1
行数 = (-1+(1+8*lg)**0.5)/2,可以检查 number_of_rows == int(number_of_rows) 以获取有效列表长度。 - splash58

1
您也可以使用iternext一起使用:
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))

输出:

1      
2 5    
3 6 8  
4 7 9 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接