2013-06-13 21 views
5

Więc mam funkcję, która tworzy małą tabelę gwiazd na podstawie niektórych danych zebranych w innym miejscu w programie. Podczas gdy tabela generuje poprawne dane wyjściowe, ponieważ liczba znaków w każdym numerze zmienia się, to wyrównuje tabelę. Na przykład,Jak wyrównać tekst w pythonie?

70-78: ***** 
79-87: *** 
88-96: **** 
97-105: ** 
106-114: ****** 
115-123: **** 

Czy istnieje jakiś sposób, aby gwiazdy wyrównać (hehe), tak, że wyjście jest coś takiego:

70-78: ***** 
79-87: *** 
88-96: **** 
97-105: ** 
106-114: ****** 
115-123: **** 

Oto jak ja obecnie wydrukować tabelę.

for x in range(numClasses): 
    print('{0}-{1}: {2}'.format(lower[x],upper[x],"*"*num[x])) 

Odpowiedz

6

str.format ma już możliwość określenia wyrównania. Możesz to zrobić, używając {0:>5}; to wyrównałoby parametr 0 po prawej stronie dla 5 znaków.Możemy następnie dynamicznie zbudować ciąg formatu przy maksymalnej liczby cyfr koniecznych, aby wyświetlić wszystkie numery jednakowo:

>>> lower = [70, 79, 88, 97, 106, 115] 
>>> upper = [78, 87, 96, 105, 114, 123] 
>>> num = [5, 3, 4, 2, 6, 4] 
>>> digits = len(str(max(lower + upper))) 
>>> digits 
3 
>>> f = '{0:>%d}-{1:>%d}: {2}' % (digits, digits) 
>>> f 
'{0:>3}-{1:>3}: {2}' 
>>> for i in range(len(num)): 
     print(f.format(lower[i], upper[i], '*' * num[i])) 

70- 78: ***** 
79- 87: *** 
88- 96: **** 
97-105: ** 
106-114: ****** 
115-123: **** 

Właściwie można nawet użyć jednego formatu ciąg tutaj z zagnieżdżonych dziedzinach:

>>> for i in range(len(num)): 
     print('{0:>{numLength}}-{1:>{numLength}}: {2}'.format(lower[i], upper[i], '*' * num[i], digits=numLength)) 
+0

Czy stare formatowanie ciągów jest jedynym sposobem na osadzenie wartości zmiennej w nawiasach klamrowych nowego formatowania ciągów? – CopOnTheRun

+0

Nie, można również użyć nowego formatowania tam, ale wtedy trzeba by uciec przed nawiasem klamrowym, lub użyć zamiast tego zagnieżdżonych zamienników - co, jak sobie uświadomiłem, byłoby jeszcze lepsze, więc zobacz edycję w mojej odpowiedzi :) – poke

+0

Just dla wyjaśnienia, dlaczego musisz ustawić cyfry równe sobie? Możesz użyć już zdefiniowanych zmiennych w innym miejscu funkcji '.format()'. – CopOnTheRun

5

To powinno wystarczyć. Zakładam, że istnieją sprytne sposoby.

print '70-78:'.ljust(10) + '*****' 

Można też użyć expandtabs()

print ('70-78'+'\t'+ '*****').expandtabs(10) 
+0

lub , dla przykładu OP: 'print ('{0} - {1}: \ t {2}'. format (niższe [x], górne [x]," * "* num [x]). expandtabs (10)) ' – zmo

+0

.ljust() działał świetnie – lopezdp

0

łatwy sposób (w danym przypadku) byłoby umieścić kartę zamiast przestrzeni:

for x in range(numClasses): 
    print('{0}-{1}:\t{2}'.format(lower[x],upper[x],"*"*num[x])) 

Innym sposobem byłoby wykorzystanie str.ljust :

for x in range(numClasses): 
    label = '{0}-{1}:'.format(lower[x], upper[x]) 
    print(label.ljust(10, ' ') + "*" * num[x]) 
0

Ok, natomiast rozwiązanie używam jest wprawdzie ad-hoc, to działa, i skaluje lepiej niż odpowiedzi tak daleko. Zasadniczo jest to po prostu metoda zalecana przez VR17, ale z nieco większym zakresem, aby rozmiar tabulatora skalował się z zestawem danych, i nie jest tylko kodowany na stałe.

Najpierw zrobiłem metodę, która zwraca liczbę znaków w pewnej liczbie .

def charNum(number): 
    return math.floor(math.log(number,10)+1) 

Następnie użyłem funkcji charNum() w ostatnim momencie z moich zbiorów danych lower i upper. Tylko ostatni punkt musiał być użyty na każdej liście, ponieważ ostatni punkt jest największą liczbą. Następnie policzyłem postać, która nie była cyframi (kreska, średnik i spacja) i odpowiednio dostosowana.
więc zmienna tabLength końcowy wygląda tak:

tabLength = charNum(lower[-1])+charNum(upper[-1])+3 

I wtedy podłączony zmienną tabLength do funkcji expandTab() aby uzyskać odpowiednie odstępy. Oto kilka przykładów wyjścia:

1-11: ******* 
12-22: * 
23-33: *** 
34-44: ** 
45-55: *** 
56-66: * 

99-249: ***** 
250-400: **** 
401-551: ** 
552-702: ** 
703-853: * 
854-1004: *** 

99-200079:  ****** 
200080-400060: ** 
400061-600041: **** 
600042-800022: ** 
800023-1000003: * 

Jedynym problemem mogę zobaczyć naprawdę z tym jest, że jeśli chcę, aby rozwinąć to do tabeli lub coś wypustki byłoby wszystko odjazdowe. Jeśli jednak to zrobię, prawdopodobnie zajrzę do ljust i rjust, z których nie jestem zaznajomiony. Pozostawię pytanie otwarte na chwilę, na wypadek gdyby ktoś wymyślił lepszą odpowiedź.

Powiązane problemy