Wie drucke ich eine Zeichenfolge mit fester Breite?
Lesezeit: 8 Minuten
0x90
Ich habe diesen Code (druckt das Vorkommen aller Permutationen in einer Zeichenfolge)
def splitter(str):
for i in range(1, len(str)):
start = str[0:i]
end = str[i:]
yield (start, end)
for split in splitter(end):
result = [start]
result.extend(split)
yield result
el =[];
string = "abcd"
for b in splitter("abcd"):
el.extend(b);
unique = sorted(set(el));
for prefix in unique:
if prefix != "":
print "value " , prefix , "- num of occurrences = " , string.count(str(prefix));
Ich möchte alle Permutationsvorkommen drucken, die es in String-Variablen gibt.
Da die Permutation nicht die gleiche Länge hat, möchte ich die Breite fixieren und in einer schönen Form drucken, die nicht so ist:
value a - num of occurrences = 1
value ab - num of occurrences = 1
value abc - num of occurrences = 1
value b - num of occurrences = 1
value bc - num of occurrences = 1
value bcd - num of occurrences = 1
value c - num of occurrences = 1
value cd - num of occurrences = 1
value d - num of occurrences = 1
Wie kann ich verwenden format es zu tun?
Ich habe diese Beiträge gefunden, aber es ging nicht gut mit alphanumerischen Zeichenfolgen:
Python-String-Formatierung mit fester Breite
Festlegen einer festen Länge mit Python
was ist mit print ‘%10s’ % ‘mystring’
– TJD
9. Dezember 11 um 19:14 Uhr
Überrascht das "t" wird in keiner Lösung als Option aufgeführt.
Falls Sie die Zeichenfolge an der richtigen Verwendung ausrichten möchten > anstatt <:
>>> '{0: >5}'.format('ss')
' ss'
Bearbeiten 1: Wie in den Kommentaren erwähnt: die 0 in '{0: <5}' gibt den übergebenen Index des Arguments an str.format().
Bearbeiten 2: In Python3 könnte man auch f-Strings verwenden:
sub_str="s"
for i in range(1,6):
s = sub_str*i
print(f'{s:>5}')
' s'
' ss'
' sss'
' ssss'
'sssss'
oder:
for i in range(1,5):
s = sub_str*i
print(f'{s:<5}')
's '
'ss '
'sss '
'ssss '
'sssss'
Bemerkenswert, an einigen Stellen oben, ' ' (einfache Anführungszeichen) wurden hinzugefügt, um die Breite der gedruckten Zeichenfolgen hervorzuheben.
Außerdem gibt die 0 die Position des Formatarguments an, sodass Sie zwei weitere Dinge tun können: '{<5}'.format('ss')'ss ' genau wie vorher, aber ohne die 0, macht das gleiche oder 'Second {1: <5} and first {0: <5}'.format('ss', 'sss')'Second sss and first ss ' So können Sie dieselbe Variable mehrmals in einer einzigen Ausgabezeichenfolge neu anordnen oder sogar ausgeben.
– mächtiger Haufen
23. Dezember 13 um 17:59 Uhr
Ich kann den vorherigen Kommentar nicht mehr bearbeiten, was es braucht. {<5} geht nicht, aber {: <5} funktioniert ohne den Indexwert.
– mächtiger Haufen
23. Dezember 2013 um 18:45 Uhr
Hier ist die Python Formatspezifikation Mini-Sprache Beschreibung dieser Formatzeichenfolgen und zusätzlicher Optionen. Zum schnellen Nachschlagen das Leerzeichen in {0: <5} ist der [fill] , das < ist [align], und 5 ist [width]
– cod3monk3y
23. November 14 um 6:08 Uhr
Diese 5 kann eine Variablensubstitution sein >>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('n') ['ssssss '] >>>
– gjois
4. November 16 um 11:16 Uhr
Sie können auch Zahlen verwenden und die Variablen einfach der Reihe nach auflisten width=10; "{0: <{1}}".format('sss', width). Oder die Nummern weglassen '{: <{}}'.format('sss', width)
– joelostblom
7. Januar 17 um 14:42 Uhr
Mac
BEARBEITEN 11.12.2013 – Diese Antwort ist sehr alt. Es ist immer noch gültig und richtig, aber die Leute, die sich das ansehen, sollten das bevorzugen neue Formatsyntax.
das % Zeichen informiert Python, dass ein Token durch etwas ersetzt werden muss
das s Zeichen informiert Python, dass das Token ein String sein wird
das 5 (oder welche Zahl Sie auch immer wünschen) weist Python an, die Zeichenfolge mit Leerzeichen von bis zu 5 Zeichen aufzufüllen.
In Ihrem konkreten Fall könnte eine mögliche Umsetzung wie folgt aussehen:
>>> dict_ = {'a': 1, 'ab': 1, 'abc': 1}
>>> for item in dict_.items():
... print 'value %3s - num of occurances = %d' % item # %d is the token of integers
...
value a - num of occurances = 1
value ab - num of occurances = 1
value abc - num of occurances = 1
RANDNOTIZ: Ich habe mich nur gefragt, ob Sie sich der Existenz bewusst sind itertools Modul. Zum Beispiel könnten Sie eine Liste aller Ihrer Kombinationen in einer Zeile erhalten mit:
und Sie können die Anzahl der Vorkommen erhalten, indem Sie verwenden combinations in Verbindung mit count().
Sie sollten vielleicht erwähnen, dass negative Zahlen eine linksbündige aufgefüllte Ausgabe liefern; dies ist für einen Anfänger kaum intuitiv.
– Dreier
14. Oktober 12 um 6:27 Uhr
+1 für @tripleee, ohne Ihre negativen Zahlen geben Sie einen linksbündigen Kommentar ab, ich hätte mir länger den Kopf gestoßen … thx m8.
– Brian Wylie
17. Januar 14 um 23:27 Uhr
Dies ist viel intuitiver und prägnanter als das neue str.format. Ich verstehe nicht, warum es in Python diesen Schub in Richtung Faltung gibt
– Scottmrogowski
6. Juni 14 um 0:39 Uhr
Gibt es eine Möglichkeit, die Leerstellen mit einem bestimmten Zeichen zu füllen? Wenn wir zum Beispiel “05” anstelle von “5” drucken müssen
– Harter Jindal
9. Juni 18 um 18:10 Uhr
Hier sind einige weitere Tricks für den eleganten Druck mit fester Breite und F-Strings Mittel.
– pfabri
22. September 19 um 17:27 Uhr
joelostblom
Ursprünglich als Bearbeitung der Antwort von @ 0x90 gepostet, aber sie wurde abgelehnt, weil sie von der ursprünglichen Absicht des Beitrags abwich, und es wurde empfohlen, sie als Kommentar oder Antwort zu posten, daher füge ich hier die kurze Beschreibung hinzu.
Zusätzlich zur Antwort von @0x90 kann die Syntax flexibler gemacht werden, indem eine Variable für die Breite verwendet wird (gemäß dem Kommentar von @ user2763554):
Außerdem können Sie diesen Ausdruck kürzer machen, indem Sie nur Zahlen verwenden und sich auf die Reihenfolge der übergebenen Argumente verlassen format:
width=10
'{0: <{1}}'.format('sss', width)
Oder lassen Sie sogar alle Zahlen für maximale, möglicherweise nicht pythonisch implizite Kompaktheit weg:
format ist definitiv der eleganteste Weg, aber afaik können Sie das nicht mit Pythons verwenden logging Modul, also hier ist, wie Sie es mit dem tun können % Formatierung:
__________________________________________________________________
Name Country Age
__________________________________________________________________
Niroshan Srilanka 20
Brayan Australia 25
Kate England 30
__________________________________________________________________
Abu Schuhb
ich fand ljust() und rjust() sehr nützlich, um einen String mit fester Breite zu drucken oder einen Python-String mit Leerzeichen zu füllen.
Für Ihren Fall verwenden Sie Fall fstring zu drucken
for prefix in unique:
if prefix != "":
print(f"value {prefix.ljust(3)} - num of occurrences = {string.count(str(prefix))}")
Erwartete Ausgabe
value a - num of occurrences = 1
value ab - num of occurrences = 1
value abc - num of occurrences = 1
value b - num of occurrences = 1
value bc - num of occurrences = 1
value bcd - num of occurrences = 1
value c - num of occurrences = 1
value cd - num of occurrences = 1
value d - num of occurrences = 1
Du kannst ändern 3 auf die höchste Länge Ihrer Permutationszeichenfolge.
.
7591200cookie-checkWie drucke ich eine Zeichenfolge mit fester Breite?yes
was ist mit print ‘%10s’ % ‘mystring’
– TJD
9. Dezember 11 um 19:14 Uhr
Überrascht das
"t"
wird in keiner Lösung als Option aufgeführt.– Benutzer7345804
17. Februar ’18 um 20:00 Uhr