Formatierung von String-Literalen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
floh007
User
Beiträge: 1
Registriert: Dienstag 9. November 2021, 20:06

Einen wunderschönen guten Abend an Alle.
Mein Ziel ist es eine Kommandozeilenausgabe zu erhalten, in der eine formatierte Liste, bestehend aus zwei Arrays, ausgegeben wird. Soweit so gut, ich könnte einfach folgenden Code schreiben:

Code: Alles auswählen

for i in range(len(file1)):
    print("{0:14}{1:14}".format
        (file1[i], file2[i]))
Mein Problem ist, dass die Elemente in der Liste 'file1' unterschiedlich lang sind und ich die Ausgabe variabel der Länger des längsten Elementes anpassen möchte.
Demnach würde ich meinen Code gerne folgendermaßen anpassen wollen:

Code: Alles auswählen

x = len(longest)

for i in range(len(file1)):
    print("{0:x}{1:x}".format
        (file1[i], file2[i]))
Dies funktioniert nicht, da ich keine Variable in in die derzeitige Formatierungsvorlage einsetzen kann.
Weiß jemand wie ich eine variable Formatierungsvorlage implementieren kann?

Vielen Dank schon mal für jede Hilfe.
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Es ist ein Anti-Patter in Python mit einem Index über eine Liste zu iterieren. Stattdessen iteriert man direkt über die Elemente.

Ungetestet, sollte dir aber die Richtung weisen:

Code: Alles auswählen

for x, y in itertools.zip_longest(file1, file2, fillvalue='spam'):
    print(x, y)
Edit: Ach halt, ich habe deine Frage falsch gelesen.
Ein Anti-Pattern ist es trotzdem. Du möchtest zip() verwenden um über die beiden Listen zu iterieren.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

pairwise() wurde inzwischen vom Rezept zur Bibliotheks-Funktion befördert. Damit, und mit den passenden Mechanismen der f-Strings, könnte man es so machen - falls ich das Problem richtig verstanden habe:

Code: Alles auswählen

from itertools import pairwise
from random import choice, choices
from string import ascii_letters

lengths = list(range(1, 20))
words = []
for i in range(10):
    length = choice(lengths)
    word = ''.join(chars
            for chars
            in choices(ascii_letters, k=length))
    words.append(word)
max_len = max(len(word) for word in words)
for word1, word2 in pairwise(words):
    print(f'{word1:{max_len}}{word2:{max_len}}')
Ergebnis:

Code: Alles auswählen

kQcKCAaA          OpVq              
OpVq              SxdmKVOYMCuFhSBw  
SxdmKVOYMCuFhSBw  OnytROD           
OnytROD           kWTJPEe           
kWTJPEe           frc               
frc               eb                
eb                SHSmGR            
SHSmGR            OPaManiXMeLgxnyrIr
OPaManiXMeLgxnyrIrzaFvqAedWMQFrK    
Wenn ich mir die letzte Zeile anschaue, sollte wohl noch ein Leerzeichen in den f-String.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn man weniger selbst implementieren und potentiell mehr Funktionalität haben möchte, könnte man das auch mit `rich` lösen.

Code: Alles auswählen

#!/usr/bin/env python3
from random import choices, randint
from string import ascii_letters

import rich
from more_itertools import pairwise
from rich.table import Table


def main():
    words = [
        "".join(choices(ascii_letters, k=randint(1, 20))) for _ in range(20)
    ]
    
    table = Table(
        box=None, show_header=False, show_footer=False, pad_edge=False
    )
    for pair in pairwise(words):
        table.add_row(*pair)

    rich.print(table)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten