Wie drucke ich eine Zeichenfolge mit fester Breite?

Lesezeit: 8 Minuten

Wie drucke ich eine Zeichenfolge mit fester Breite
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.

    Benutzer7345804

    17. Februar ’18 um 20:00 Uhr

Wie drucke ich eine Zeichenfolge mit fester Breite
0x90

Ich finde Verwendung str.format viel eleganter:

>>> '{0: <5}'.format('s')
's    '
>>> '{0: <5}'.format('ss')
'ss   '
>>> '{0: <5}'.format('sss')
'sss  '
>>> '{0: <5}'.format('ssss')
'ssss '
>>> '{0: <5}'.format('sssss')
'sssss'

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


Wie drucke ich eine Zeichenfolge mit fester Breite
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.

Sie können verwenden Zeichenfolgenformatierung so was:

>>> print '%5s' % 'aa'
   aa
>>> print '%5s' % 'aaa'
  aaa
>>> print '%5s' % 'aaaa'
 aaaa
>>> print '%5s' % 'aaaaa'
aaaaa

Grundsätzlich:

  • 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:

>>> [''.join(perm) for i in range(1, len(s)) for perm in it.permutations(s, i)]
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'ba', 'bc', 'bd', 'ca', 'cb', 'cd', 'da', 'db', 'dc', 'abc', 'abd', 'acb', 'acd', 'adb', 'adc', 'bac', 'bad', 'bca', 'bcd', 'bda', 'bdc', 'cab', 'cad', 'cba', 'cbd', 'cda', 'cdb', 'dab', 'dac', 'dba', 'dbc', 'dca', 'dcb']

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

1643915776 330 Wie drucke ich eine Zeichenfolge mit fester Breite
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):

width=10
'{0: <{width}}'.format('sss', width=width)

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:

width=10
'{: <{}}'.format('sss', width)

Aktualisierung 2017-05-26

Mit die Einführung von formatierten String-Literalen (kurz: “f-strings”) in Python 3.6 ist es nun möglich, mit einer kürzeren Syntax auf zuvor definierte Variablen zuzugreifen:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

Dies gilt auch für die Zeichenfolgenformatierung

>>> width=10
>>> string = 'sss'
>>> f'{string: <{width}}'
'sss       '

  • Diese Antwort gefällt mir wirklich am besten!

    – Syrtis Major

    1. Mai 20 um 5:15 Uhr

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:

formatter = logging.Formatter(
    fmt="%(asctime)s | %(name)-20s | %(levelname)-10s | %(message)s",
)

Hier die - steht für Linksbündigkeit und die Zahl davor s gibt die feste Breite an.

Einige Beispielausgaben:

2017-03-14 14:43:42,581 | this-app             | INFO       | running main
2017-03-14 14:43:42,581 | this-app.aux         | DEBUG      | 5 is an int!
2017-03-14 14:43:42,581 | this-app.aux         | INFO       | hello
2017-03-14 14:43:42,581 | this-app             | ERROR      | failed running main

Mehr Infos in den Dokumenten hier: https://docs.python.org/2/library/stdtypes.html#string-formatting-operations

>>> print(f"{'123':<4}56789")
123 56789

1643915777 274 Wie drucke ich eine Zeichenfolge mit fester Breite
dreifach

Dies hilft, eine feste Länge beizubehalten, wenn Sie mehrere Elemente in einer Druckanweisung drucken möchten.

25s formatiert einen String mit 25 Leerzeichen, standardmäßig linksbündig.

5d formatiert eine ganze Zahl, die 5 Leerzeichen reserviert, standardmäßig rechtsbündig.

members=["Niroshan","Brayan","Kate"]
print("__________________________________________________________________")
print('{:25s} {:32s} {:35s} '.format("Name","Country","Age"))
print("__________________________________________________________________")
print('{:25s} {:30s} {:5d} '.format(members[0],"Srilanka",20))
print('{:25s} {:30s} {:5d} '.format(members[1],"Australia",25))
print('{:25s} {:30s} {:5d} '.format(members[2],"England",30))
print("__________________________________________________________________")

Und das wird gedruckt

__________________________________________________________________
Name                      Country                          Age
__________________________________________________________________
Niroshan                  Srilanka                          20
Brayan                    Australia                         25
Kate                      England                           30
__________________________________________________________________

1643915777 148 Wie drucke ich eine Zeichenfolge mit fester Breite
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.

Ein Beispiel

print('123.00'.rjust(9))
print('123456.89'.rjust(9))

# expected output  
   123.00
123456.89

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.

.

759120cookie-checkWie drucke ich eine Zeichenfolge mit fester Breite?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy