Вопрос

В настоящее время я работаю над домашним заданием для создания того, что известно как Треугольник Паскаля в питоне.

До сих пор это то, что у меня есть:

def mytri(myrange):
    trianglevar = [[1]]
    for i in range(1, myrange):
        tempvar = [1]
        for n in range(0, i-1):
            tempvar.append(trianglevar[i-1][n]+trianglevar[i-1][n+1])
        tempvar.append(1)
        trianglevar.append(tempvar)
    return trianglevar

def mymenu():
    for i in mytri(int(raw_input("Please enter the height of the triangle: "))):
        print i
    print '\n'
    choicevar = raw_input("Would you like to create another triangle? (y/n): ")
    if choicevar == "y":
        mymenu()
    else:
        print "Goodbye."

mymenu()

Что делает программа до этого момента, выполняет расчет для треугольника. Он рассчитывает числа в каждой строке (начиная с 1) и останавливается после достижения количества строк, указанных пользователем.

Однако я не уверен, как отформатировать мой треугольник. В настоящее время он печатает как:

[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.

Выход я хочу:

        [1]
      [1, 1]
    [1, 2, 1]
  [1, 3, 3, 1]
[1, 4, 6, 4, 1]
...etc.

(Это немного из-за кронштейнов / запятых, но я просто пытаюсь получить общий формат прямо сейчас.)

Спасибо за любую помощь, которую вы можете предложить!

Это было полезно?

Решение

h = int(raw_input("Please enter the height of the triangle: "))
for i in mytri(h):
    print " " * (h * 2), i
    h -= 1

Так что здесь вы печатаете 2 места для каждого уровня пирамиды. Первая строка получает отступ вдвое больше высокого количества пробелов. Когда вы спускаетесь на один уровень, вы уменьшаете углубление на 2.

Другие советы

Вот пара подсказки. Пытаться:

' ' * someNumber

для расстояния. Если вы не хотите, чтобы скобки списка вы можете включить в строку:

for el in i:
  # Write el as you want

или использовать join.

Вы также можете найти enumerate полезно получить индексы (например, для расстояния).

Как только у вас есть строки, у вас, вероятно, будет иметь последний ряд как самый длинный.

Так как вы просто распечатаете их, вы можете принять l = len(str(rows[-1])) А потом, объедините это с str(rows[i]).center(l) для каждого ряда.

РЕДАКТИРОВАТЬ: Не знал, что мы должны дать все ответы на домашнее задание ... если так:

def mytri(myrange):
    rows = list()
    lr = None # Last row

    for i in xrange(myrange+1):
        try:
            lr = [1] + [lr[i] + lr[i+1] for i in range(len(lr) - 1)] + [1]
        except TypeError:
            lr = [1]
        #rows.append(str(lr))
        rows.append(' '.join(str(v) for v in lr))
    return rows

rows = mytri(10)
l = len(rows[-1])
print '\n'.join(v.center(l) for v in rows)

Будет выдвигать

                 1                 
                1 1                
               1 2 1               
              1 3 3 1              
             1 4 6 4 1             
           1 5 10 10 5 1           
          1 6 15 20 15 6 1         
        1 7 21 35 35 21 7 1        
       1 8 28 56 70 56 28 8 1      
    1 9 36 84 126 126 84 36 9 1    
1 10 45 120 210 252 210 120 45 10 1

Вместо регенерации предыдущих строк на каждой итерации вы можете дать каждую строку, поскольку вы его генерируете:

def mytri(height):
  start = [1]
  for _ in xrange(height):  # "_" for an unused variable
    yield start  # loop written "backwards" for simplicity,
    # though this does generate one unused row
    next_row = [1]
    for a, b in zip(start, start[1:]):  # slicing creates a new list, not a
      next_row.append(a + b)            # concern for this problem, but in
    next_row.append(1)                  # others you could use itertools.islice
    start = next_row                    # to avoid that

Теперь перечисляйте высоту назад вместе с каждым рядом:

height = int(raw_input("Height: "))
for n, row in zip(xrange(height - 1, -1, -1), mytri(height)):
  print "   " * n, " ".join("%5d" % x for x in row)

Это быстро не будет выстроиться с очень много строк, но надо вы направиться в правильном направлении.

Вам нужно прокладывать все номера, чтобы они та же ширина
Вам также нужно добавить немного прокладки на левую сторону

def mymenu():
    res = mytri(int(raw_input("Please enter the height of the triangle: ")))
    width = len(str(res[-1][len(res[-1])/2]))
    for i, row in enumerate(res):
        print " "*(width*(len(res)-i)/2)+" ".join(str(x).rjust(width) for x in row)
    print '\n'
    choicevar = raw_input("Would you like to create another triangle? (y/n): ")
    if choicevar == "y":
        mymenu()
    else:
        print "Goodbye."

выход:

Please enter the height of the triangle: 10
                1 
              1   1 
             1   2   1 
           1   3   3   1 
          1   4   6   4   1 
        1   5   10  10  5   1 
       1   6   15  20  15  6   1 
     1   7   21  35  35  21  7   1 
    1   8   28  56  70  56  28  8   1 
  1   9   36  84 126 126  84  36  9   1 
n=input('enter n:')
z=0
d=' '
while z<n:
        d=d+'   '
        z=z+1
print d,1
l1=[1]
l2=[1,1]
def space(n,a):
        s=''
        while a<n:
        s=s+' '
        a=a+1
        return s
def digit(n):
        r=1
        k=0
        while r!=0:
            r=n/10**k
            k=k+1
        return k-1
def print_l(l1,b):
        d=''
        d='\n'+space(b-1,0)*3
        i=0
        while i<len(l1):
            d=d+' '*(6-digit(l1[i]))+str(l1[i])
            i=i+1
        print d
b=n-1
k=1
while k<n:
        l2=l1
        l1=[1]
        i=1
        while len(l1)<len(l2):
            if i>len(l2)/2:
                l1.append(l1[len(l2)-i])
            else:
                l1.append(l2[i-1]+l2[i])
            i=i+1   
        k=k+1
        l1.append(1)
        print_l(l1,b)
        b=b-1
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top