Question

Je travaille actuellement sur un devoir pour générer ce qu'on appelle triangle de Pascal en Python .

Jusqu'à présent, ce que j'ai:

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

Qu'est-ce que le programme fait jusqu'à ce point est effectuer le calcul pour le triangle. Il calcule les nombres dans chaque rangée (à partir de 1), et arrête après avoir atteint le nombre de lignes spécifié par l'utilisateur.

Cependant, je ne suis pas sûr de savoir comment formater mon triangle. Il imprime actuellement:

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

La sortie que je veux est:

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

(Il est un peu hors du fait des supports / virgules, mais je suis juste essayer d'obtenir le format général vers le bas en ce moment.)

Merci pour toute aide que vous pouvez offrir!

Était-ce utile?

La solution

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

Alors là, vous imprimer 2 places pour chaque niveau de la pyramide. La première ligne s'échancrée par deux fois le nombre de la hauteur des espaces. Comme vous la descente d'un niveau, vous diminuez indentation par 2.

Autres conseils

Voici un conseils de couple. Essayez:

' ' * someNumber

pour l'espacement. Si vous ne voulez pas les crochets de la liste, vous pouvez boucler sur la ligne:

for el in i:
  # Write el as you want

ou utilisez join .

Vous pouvez également trouver enumerate utile pour obtenir des indices (par exemple pour l'espacement) .

Une fois que vous avez vos lignes, vous auriez probablement la dernière ligne la plus longue.

Puisque vous les imprimer simplement, vous pouvez alors prendre la l = len(str(rows[-1])) puis, combiner cela avec une str(rows[i]).center(l) pour chaque ligne.

EDIT: ne savais pas que nous devrions donner toutes les réponses aux devoirs ... Si oui:

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)

génèrerait

                 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

Au lieu de régénérer les lignes précédentes à chaque itération, vous pouvez produire chaque ligne que vous générez:

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

énumérer maintenant les vers l'arrière le long de la hauteur de chaque ligne:

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)

Cela rapidement aligne pas avec de très nombreuses lignes, mais il vous devriez obtenir dirigiez dans la bonne direction.

Vous devez pad tous les numéros de sorte qu'ils sont de la même largeur
Vous devez également ajouter un peu de rembourrage sur le côté gauche

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."

sortie:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top