2016-07-02 9 views
1

Um einen Header für tabellarische Daten zu drucken, Ich mag würde nur ein Format-String line und eine Spezifikation für Spaltenbreiten w1, w2, w3 zu verwenden (oder sogar w = x, y, z, wenn möglich.)Variablen für Breite in Python Format-String

Ich habe mir this angesehen, aber tabulate etc. Lassen Sie mich nicht Dinge in der Spalte wie format rechtfertigen.

Dieser Ansatz funktioniert:

head = 'eggs', 'bacon', 'spam' 
w1, w2, w3 = 8, 7, 10 # column widths 
line = ' {:{ul}>{w1}} {:{ul}>{w2}} {:{ul}>{w3}}' 
under = 3 * '=' 
print line.format(*head, ul='', w1=w1, w2=w2, w3=w3) 
print line.format(*under, ul='=', w1=w1, w2=w2, w3=w3) 

Muss ich einzelne Namen als Breiten {w1}, {w2}, ... im Format-String? Versuche wie {w[1]}, {w[2]} ergeben entweder KeyError oder keyword can't be an expression.

Auch ich denke, die w1=w1, w2=w2, w3=w3 ist nicht sehr prägnant. Gibt es einen besseren Weg?

+2

Warum benutzen Sie kein Wörterbuch - 'w = {'w1': 8, 'w2': 7, 'w3': 10}' dann rufen Sie 'line.format (..., ** w)'. Sie könnten sogar das Wörterbuch dynamisch aus '[8, 7, 10]' - 'w = {'w {}' erstellen format (index): Wert für Index, Wert in enumerate ([8, 7, 10], 1)} '. – jonrsharpe

+0

@jonrsharpe Danke! Ich gebe zu, ich musste deinen automatischen Diktator ein wenig studieren, bevor ich es verstand. Siehe auch unten .. – RolfBly

Antwort

0

Dies ist jonrsharpe Kommentar zu meinem OP, ausgearbeitet, um sichtbar zu machen, was los ist.

line = ' {:{ul}>{w1}} {:{ul}>{w2}} {:{ul}>{w3}}' 
under = 3 * '_' 

head = 'sausage', 'rat', 'strawberry tart' 

# manual dict 
v = {'w1': 8, 'w2':5, 'w3': 17} 
print line.format(*under, ul='_', **v) 

# auto dict 
widthl = [8, 7, 9] 
x = {'w{}'.format(index): value for index, value in enumerate(widthl, 1)} 
print line.format(*under, ul='_', **x)  

Der Punkt ist, dass ich den Header schnell neu zu ordnen, ohne zwicken die Format-String in der Lage sein wollen. Die auto dict erfüllt diese Anforderung sehr gut.

Zum Füllen eines Diktats auf diese Weise: WOW!

+0

Kleines Dilemma: Wer bekommt die Rep-Punkte? – RolfBly

+0

Sie werden von upvotes auf diese Antwort antworten, wenn Sie das meinen. – jonrsharpe

+0

@jonrsharpe das ist was ich meine. Ich denke, du solltest sie bekommen, nicht ich. – RolfBly

1

Angabe w[0], w[1], w[2] sollte funktionieren, wenn Sie w = 8, 7, 10 definiert und übergeben w als Keyword-Argument wie unten:

>>> head = 'eggs', 'bacon', 'spam' 
>>> w = 8, 7, 10 # <--- list is also okay 
>>> line = ' {:{ul}>{w[0]}} {:{ul}>{w[1]}} {:{ul}>{w[2]}}' 
>>> under = 3 * '=' 
>>> print line.format(*head, ul='', w=w) # <-- pass as a keyword argument 
     eggs bacon  spam 
>>> print line.format(*under, ul='=', w=w) # <-- pass as a keyword argument 
    ======== ======= ========== 
+0

Danke für die Erklärung des Schlüsselwortarguments. Es ist einfacher als ich dachte. – RolfBly