Seite 1 von 1
Formatierung von String-Literalen
Verfasst: Dienstag 9. November 2021, 20:24
von floh007
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.
Re: Formatierung von String-Literalen
Verfasst: Dienstag 9. November 2021, 21:47
von sparrow
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.
Re: Formatierung von String-Literalen
Verfasst: Dienstag 9. November 2021, 21:53
von pillmuncher
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.
Re: Formatierung von String-Literalen
Verfasst: Mittwoch 10. November 2021, 17:58
von __blackjack__
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()