2017-02-11 2 views
0

Desired outputDesired outputvariant nicht finden Kann scheinen, was mit diesem bisschen Python Code falsch:Typeerror: nicht alle während Zeichenfolge konvertiert Argumente Formatierung Operation

print('%-*s', low, '%-*s', mid, ' %-*s', high, '%-*s' 
     % (8, "", (var_range//3), "", (var_range//3), "", (var_range//3), "")) 

ich Raum versuche die Variablen: low, mid und high basierend auf Eingaben des Benutzers (var_range//3). Das (var_range // 3) dient als benutzerdefinierter Abstand. Ich möchte, dass der Ausgang abhängig vom Bereich durch den Benutzer variiert.

P.S. Ich verwende Python 3.4.4

+0

Der '%' _operator_ erwartet, dass der Formatierungsstring so viele '%' _formatierende Spezifizierer_ enthält wie im folgenden Tupel. In Ihrem Code-Snippet ist die Formatierungszeichenfolge nur das letzte '% - * s'', aber das Tupel, das darauf folgt, enthält 8 Dinge (das' (8, "", (var_range // 3), "", (var_range // 3), "", (var_range // 3), "") '). – martineau

+0

Wenn ich nur 4 Dinge verwende: (8, (var_range // 3), (var_range // 3), (var_range // 3))), existiert der gleiche Fehler –

+0

Die Formatzeichenfolge ''% - * s'' erwarte nur, dass ein Item gegeben ist, weil _that string_ nur ein ''% '' Zeichen enthält (nicht 8 oder gar 4). Es könnte einfacher sein, die Methode ['str.format()'] (https://docs.python.org/3/library/stdtypes.html#str.format) zu verwenden, die nicht '%' verwendet. 'Charaktere überhaupt. Ich denke, Sie verwirren die Tatsache, dass sie für zwei verschiedene Dinge hier verwendet werden - als eine Zeichenfolge _operator_ ** und ** was dieser Operator in der Formatierung erwartet _string_ es als Teil des gesamten Ausdrucks übergeben. – martineau

Antwort

0

ich nicht ganz sicher, was Ausgabe, die Sie zu produzieren sind versucht, aber dieses Beispiel könnte helfen:

var_range = 99 
print('%*s %*s %*s' % (8, var_range//3, 8, var_range//3, 8, var_range//3)) 

Ausgang:

33  33  33 

Dieses Format-String erfordert 3 Paare von Werten für insgesamt 6 in dem Tupel, das darauf folgt. Der erste Wert jedes Paares ist die Feldbreite (8 in allen drei Fällen), und der zweite Wert ist der anzuzeigende numerische Wert (der im gleichen Fall auch derselbe ist, weil Sie auch dreimal var_range//3 wiederholt haben).

Ich habe auch die Formatierung für jeden Wert von '%-*s zu geändert, so dass die Wertanzeige rechts-gerecht ist, anstatt linksbündig mit der Breite. Einzelheiten finden Sie unter string formatting documentation.

+0

Ich habe Bilder der gewünschten Ausgabe hinzugefügt –

0

Verwendung newer style string formatting:

>>> var_range=24 
>>> print('{:<{fill}}{:<{fill}}{:<{fill}}'.format(2, 12, 22, fill=var_range//3)) 
     2  12  22  

Da Ihr Muster für jeden die gleiche ist, erstellen Sie die Formatierung für ein Feld und wiederholen Sie es 3 mal.

>>> print(('{:>{fill}}' * 3).format(2, 12, 22, fill=var_range//3)) 
     2  12  22 
Verwandte Themen