2010-11-29 14 views
28

Jeśli chcę, aby moje sformatowany ciąg dynamicznie regulowany, będę zmieniać następujący kod zformat string dynamicznie

print '%20s : %20s' % ("Python", "Very Good") 

do

width = 20 
print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good") 

Wydaje się jednak, że konkatenacji ciąg jest uciążliwe tutaj. Każdy inny sposób na uproszczenie?

Odpowiedz

21

można pobrać wartość dopełnienia z listy argumentów:

print '%*s : %*s' % (20, "Python", 20, "Very Good") 

Można nawet wstawić wartości wypełniające dynamicznie:

width = 20 
args = ("Python", "Very Good") 
padded_args = zip([width] * len(args), args) 
# Flatten the padded argument list. 
print "%*s : %*s" % tuple([item for list in padded_args for item in list]) 
5
print '%*s : %*s' % (width, 'Python', width, 'Very Good') 
+0

+1 Jest to lepsze rozwiązanie niż moje. Szukałem w tym celu prostych i rutynowych funkcji. – pyfunc

1

Jeśli nie chcesz, aby określić szerokości w tym samym czasie, możesz przygotować ciąg formatów z wyprzedzeniem, tak jak robiłeś - ale z innym zamiennikiem. Używamy %%, aby uniknąć rzeczywistych znaków% w ciągu znaków. Chcemy skończyć z %20s w naszym ciągu formatowym, gdy szerokość wynosi 20, więc używamy %%%ds i dostarczamy tam zmienną szerokości, aby ją zastąpić. Pierwsze dwa znaki% stają się literalne%, a następnie% d jest zastępowane zmienną.

Zatem:

format_template = '%%%ds : %%%ds' 
# later: 
width = 20 
formatter = format_template % (width, width) 
# even later: 
print formatter % ('Python', 'Very Good') 
+1

Podoba mi się to jako sposób dynamicznego generowania ciągów formatów w ogóle. Jednak podejście pana Hamidiego jest lepsze, jeśli tylko szerokości pola mają być interpolowane dynamicznie. –

28

Można to zrobić przy użyciu metody str.format().

>>> width = 20 
>>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width)) 
       Python :   Very Good 

Począwszy od Pythona 3.6 można użyć f-string to zrobić:

In [579]: lang = 'Python' 

In [580]: adj = 'Very Good' 

In [581]: width = 20 

In [582]: f'{lang:>{width}}: {adj:>{width}}' 
Out[582]: '    Python:   Very Good' 
+0

Dziękujemy za dodanie rozwiązania f-stringów! – Sebastiaan