2009-09-09 16 views
33

Mam niektóre dane, które wyświetlam w formacie 3 kolumnowym, w postaci:Jak wyrównać w prawo dane liczbowe?

key: value key: <tab> key: value <tab> key: value.

Oto przykład:

p: 1 sl: 10 afy: 4 
q: 12 lg: 10 kla: 3 
r: 0 kl: 10 klw: 3 
s: 67 vw: 9 jes: 3 
t: 16 uw: 9 skw: 3 
u: 47 ug: 9 mjl: 3 
v: 37 mj: 8 lza: 3 
w: 119 fv: 8 fxg: 3 
x: 16 fl: 8 aew: 3 

Jednak chciałbym, czy numery zostały dobrze dopasowane, takie jak:

a: 1 
b: 12 
c: 123 

Jak mogę to zrobić w Pythonie?

Oto istniejący kod druk mam:

print(str(chr(i+ord('a'))) + ": " + str(singleArray[i]) + "\t" + 
    str(doubleArray[i][0]) + ": " + str(doubleArray[i][1]) + "\t" + 
    str(tripleArray[i][0]) + ": " + str(tripleArray[i][1])) 

Odpowiedz

33

w Pythonie 2.5 użytku rjust (na łańcuchach). Spróbuj też przyzwyczaić się do string formatting w pythonie zamiast po prostu łączyć ciągi. Prostym przykładem dla rjust i ciąg formatowania poniżej:

width = 10 
str_number = str(ord('a')) 
print 'a%s' % (str_number.rjust(width)) 
2

Jeśli znasz aa górną granicę dla numerów, można sformatować z "%<lenght>d" % n. Biorąc pod uwagę wszystkie te obliczenia są robione i na liście (char, NUM):

mapping = ((chr(i+ord('a')), singleArray[i]), 
      (doubleArray[i][0],doubleArray[i][1]), 
      (tripleArray[i][0],tripleArray[i][1]) 
      ) 
for row in mapping: 
    print "%s: %3d" % row 
25

użyć formatowania python wyrażenie: '%widths' gdzie szerokość jest liczbą całkowitą

>>> '%10s' % 10 
'  10' 
>>> '%10s' % 100000 
' 100000' 
+17

Aby wyrównać do lewej, użyj "% -10s" (po prostu dodajesz to, ponieważ jest to najwyższy wynik Google dla wyrównania lewej strony) – Mark

72

W python 2.6+ (i jest to standardową metodą w 3), "preferowaną" metodą formatowania ciągów jest użycie string.format() (kompletne dokumenty, dla których można znaleźć here). prawo uzasadnienie można zrobić z

"a string {0:>5}".format(foo) 

to użyje 5 miejsc, jednak

"a string {0:>{1}}".format(foo, width) 

jest również ważne i użyje szerokość wartość przesyłana do .format().

+1

Nie wiem, dlaczego ta odpowiedź została odrzucona, ponieważ jest niepoprawna - dla uzasadnienia/wyrównania, konieczne jest użycie '" {:> 5} ", gdzie'> 'wskazuje wyrównanie do prawej (domyślne dla ciągów jest < Pat

+6

Została wznowiona, ponieważ ">" jest domyślną wartością pola "wyrównania" dla liczb, a pytanie dotyczyło liczb. Masz jednak rację, że poprawa jest lepsza. –

+1

Mea culpa.Znalazłem to pytanie, ponieważ próbowałem wyrównać łańcuchy znaków i nie przeczytałem pytania OP wystarczająco blisko, by złapać, że drukowane są tylko liczby. Dzięki za wytłumaczenie. – Pat

3

W Pythonie 3.6 można użyć Literal String Interpolation, który jest mniej rozwlekły i prawdopodobnie bardziej intuicyjne w obsłudze:

width = 5 
number = 123 
print (f'{number:>{width}}') 

lub po prostu:

number = 123 
print (f'{number:>5}') 

To ponowne wykorzystanie znacznie składni str.format().

Zgaduję/mam nadzieję, że będzie to preferowana metoda w przyszłości.

+0

GitHub: [Używanie interpolacji ciągów literowych f-stringów bez Pythona 3.6] (https://github.com/damnever/fmt) –