Frage

Zur Zeit arbeite ich an einer Hausaufgabe zu erzeugen, was als Pascals Dreieck in Python .

Bisher das ist, was ich habe:

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

Was macht das Programm bis zu diesem Punkt ist die Berechnung für das Dreieck durchzuführen. Es berechnet die Zahlen in jeder Reihe (beginnend mit 1), und hält an, nachdem die Anzahl der Zeilen durch den Benutzer angegeben zu erreichen.

Allerdings bin ich mir nicht sicher, wie mein Dreieck zu formatieren. Aktuelle Zeit druckt wie:

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

Der Ausgang ich will, ist:

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

(Es ist ein bisschen off aufgrund der Klammern / Kommas, aber ich versuche, nur auf das allgemeine Format zu bekommen jetzt.)

Vielen Dank für jede Hilfe können Sie anbieten!

War es hilfreich?

Lösung

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

So, hier drucken Sie zwei Räume für jede Ebene der Pyramide. Erste Zeile wird um das Doppelte der Höhe Anzahl von Leerzeichen eingerückt. Wie Sie eine Ebene absteigen, verringern Sie Vertiefung von 2.

Andere Tipps

Hier sind ein paar Hinweise. Versuchen Sie:

' ' * someNumber

für den Abstand. Wenn Sie nicht über die Liste Klammern möchten, können Sie eine Schleife über die Zeile:

for el in i:
  # Write el as you want

oder benutzen join .

Sie können auch finden enumerate hilfreich Indizes zu erhalten (zB für Abstand) .

Wenn Sie Ihre Reihen haben, würden Sie wahrscheinlich die letzte Zeile als die längste haben.

Da Sie sie einfach ausdrucken, können Sie dann die l = len(str(rows[-1])) nehmen und dann kombinieren, dass mit einem str(rows[i]).center(l) für jede Zeile.

EDIT: war nicht bewusst, dass wir alle die Antworten auf Hausaufgaben geben sollte ... Wenn ja:

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)

Would Ausgabe

                 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

Statt die vorherigen Zeilen auf jeder Iteration zu regenerieren, können Sie jede Zeile ergeben, wie Sie es erzeugen:

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

Sie nun die Höhe rückwärts aufzählen zusammen mit jeder Zeile:

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)

Das wird die Linie schnell nicht mit sehr vielen Zeilen, aber es sollten Sie in die richtige Richtung geleitet.

Sie müssen alle Zahlen Pad, so dass sie die gleiche Breite
sind Sie müssen auch eine gewisse Polsterung an der linken Seite hinzufügen

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

Ausgabe:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top