Seite 1 von 1

Tabellen Formatierung

Verfasst: Donnerstag 27. Januar 2005, 16:08
von Gast
Hallo,
ich bin relativ neu in Python.
Ich versuche gerade Ergebnisse in einer Art Tabelle zusammenfassend in ein File zu schreiben.
Also die Tabelle sollte 6 Spalten haben.
Etwa so:
Status Parameter Value1 Value2 line1 line2

Mein Problem ist dass Formatierungszeichen wie "%10s" % parameter
leider zu verschobenen einträgen führen da ja die Parameter und die Werte unterschiedlich lang sind...

Kann mir jemand helfen wie ich das einfachheit halber realisieren kann? Ich wünschte es ginge so dass exakt unter dem Buchstaben P von Parameter die ganzen Parameter Namen anfangen...und auch unter V von Value1 die Werte dann anfangen..

Danke euch

Verfasst: Donnerstag 27. Januar 2005, 16:46
von Leonidas
Du kannst dir ja Funktionen schreiben, die die einzelnen Strings "ausdehnen", indem sie Whitespaces einfügen. Das wäre eine Möglichkeit. Eine andere wäre die Nutzung von Tabs.

Verfasst: Donnerstag 27. Januar 2005, 16:47
von XT@ngel
Spontan fällt mir ein, den längsten wert einer Spalte suchen, und die anderen werte dieser Spalte mit hilfe von string.rjust() auf diese Länge mit Leerzeichen erweitern.

MfG
Andreas

Verfasst: Donnerstag 27. Januar 2005, 17:01
von XT@ngel
hier mal eine fünf Minuten Lösung:

Code: Alles auswählen

Spalte_1 = ["Status", "843854054950", "3473439438"]

def Find_maxLaenge(Spalte):
    max_laenge = 0
    for Wert in Spalte:
        laenge = len(Wert)
        if laenge > max_laenge:
            max_laenge = laenge
    return max_laenge

just = Find_maxLaenge(Spalte_1)
for Value in Spalte_1:
    print Value.ljust(just) + "|"
mfG
Andreas

Verfasst: Donnerstag 27. Januar 2005, 17:02
von Dookie
Hi,

wohl eher str.ljust(n)

Du kannst aber auch bei der Stringformatierung mit % einfach einen Negativen Wert nehmen, dann wird der String linksbündig ausgegeben

Code: Alles auswählen

text1 = "Hallo"
text2 = "Welt"
fmt = "%-20s%-20s[ENDE]"
print fmt % (text1, text2)
Gruß

Dookie

Verfasst: Donnerstag 27. Januar 2005, 17:35
von BlackJack
Finden der maximalen Länge etwas kürzer:

Code: Alles auswählen

def find_max_length(iterable):
    return reduce(max, map(len, iterable), 0)

Verfasst: Donnerstag 27. Januar 2005, 18:20
von Dookie
oder mit LC statt map:

Code: Alles auswählen

def find_max(iteralble):
    return max([len(x) for x in iterable])
keine Chance für den max sich noch zu verstecken ;)

@BlackJack: das reduce brauchts ned, max sucht aus einer beliebigen Reihe das Maximum raus, nicht nur aus einem Paar.


Gruß

Dookie

Verfasst: Freitag 28. Januar 2005, 20:19
von Gast
Ja Öha...
ein mal wech und dann schon so viel Hilfe....Danke euch allen. Werd mich gleich mal ransetzen und schauen das ichs hinformatier ;o)

Danke

Verfasst: Montag 31. Januar 2005, 13:12
von BlackJack
Dookie hat geschrieben:@BlackJack: das reduce brauchts ned, max sucht aus einer beliebigen Reihe das Maximum raus, nicht nur aus einem Paar.
Fast beliebige Sequenz -- diese hier funktioniert nicht: []. Bei dem reduce() hatte ich als Anfangswert deshalb eine 0 angegeben.

Verfasst: Montag 31. Januar 2005, 13:35
von Dookie
[] hat aber auch kein Maximum, auch nicht 0. Ausserdem wird bei reduce für jedes Element der Liste max aufgerufen während ohne reduce das ganze innerhalb der max-Funktion läuft. Was sicher um einiges performanter ist.
Ich würd halt vor dem Aufruf von find_max testen ob iterable leer ist oder das ganze in einen try: ... except ValueError: ... Block einschließen.


Gruß

Dookie