Ich versuche, eine schöne Spaltenliste in Python für die Verwendung mit von mir erstellten Befehlszeilen-Admin-Tools zu erstellen.
Grundsätzlich möchte ich eine Liste wie:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Zu etwas werden:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Die Verwendung einfacher Registerkarten reicht hier nicht aus, da ich nicht die längsten Daten in jeder Zeile kenne.
Dies ist das gleiche Verhalten wie 'column -t' unter Linux.
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c"
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c" | column -t
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Ich habe mich nach verschiedenen Python-Bibliotheken umgesehen, kann aber nichts Nützliches finden.
Antworten:
Dies berechnet die längste Dateneingabe, um die Spaltenbreite zu bestimmen, und
.ljust()
fügt dann beim Ausdrucken jeder Spalte die erforderliche Auffüllung hinzu.quelle
longest
ist irreführend, weil er nicht das längste Element ist, sondern die maximale Länge. Übrigens könnte das längste mit so etwas wie genommen werden :max((w for sub in data for w in sub), key=len)
. [PS Ich war nicht derjenige, der abstimmte]max((w for ...), key=len)
gibt Ihnen den längsten Eintrag und Sie müssen dannlen
erneut einen Lauf durchführen . Ich konnte mich nicht entscheiden, was klar war, also blieb ich beim ersten. Guter Punkt zum irreführenden Variablennamen. Geändert.max(len(x) for sub in data for x in sub)
, das baut auch keine unnötigen Listen auf.column -t
Fall ist.Da Python 2.6+ können Sie einen verwenden Format - String in der folgenden Art und Weise die Spalten auf ein Minimum von 20 Zeichen und align Text nach rechts zu setzen.
Ausgabe:
quelle
{: >20}
, um weitere Felder anzuzeigenIch bin mit den gleichen Anforderungen hierher gekommen, aber die Antworten von @lvc und @ Preet scheinen eher mit dem übereinzustimmen
column -t
in diesen Spalten unterschiedliche Breiten haben:quelle
map(len, map(str, col))
.Dies ist ein wenig spät für die Party und ein schamloser Plug für ein Paket, das ich geschrieben habe, aber Sie können auch die Columnar überprüfen Paket .
Es nimmt eine Liste von Eingabelisten und eine Liste von Headern und gibt eine tabellenformatierte Zeichenfolge aus. Dieses Snippet erstellt eine Docker-ähnliche Tabelle:
Oder Sie können mit Farben und Rändern etwas schicker werden.
Um mehr über den Spaltengrößenalgorithmus zu erfahren und den Rest der API zu sehen, können Sie den obigen Link oder das Columnar GitHub Repo lesen
quelle
Sie müssen dies mit 2 Durchgängen tun:
str.ljust()
undstr.rjust()
quelle
Das Transponieren der Spalten ist eine Aufgabe für zip:
Um die erforderliche Länge jeder Spalte zu ermitteln, können Sie Folgendes verwenden
max
:Welche Sie mit geeigneter Auffüllung verwenden können, um Zeichenfolgen zu erstellen, an die übergeben werden soll
print
:quelle
Um schickere Tische wie zu bekommen
Sie können dieses Python-Rezept verwenden :
Die Python-Rezeptseite enthält einige Verbesserungen.
quelle
pandas
basierte Lösung zum Erstellen eines Datenrahmens:Um Index- und Headerwerte zu entfernen und eine Ausgabe zu erstellen, die Sie möchten, können Sie folgende
to_string
Methode verwenden:quelle
Scolp ist eine neue Bibliothek, mit der Sie Streaming- einfache Weise drucken und gleichzeitig die Spaltenbreite automatisch anpassen können.
(Haftungsausschluss: Ich bin der Autor)
quelle
Dadurch werden unabhängige, am besten passende Spaltenbreiten basierend auf der in anderen Antworten verwendeten Maximalmetrik festgelegt.
quelle
Für faule Leute
die Python 3. * und Pandas / Geopandas verwenden ; universeller einfacher Ansatz in der Klasse (für 'normales' Skript entfernen Sie einfach self ):
Funktion kolorieren:
Header:
und dann Daten aus dem Pandas / Geopandas-Datenrahmen:
Bedeutung von
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> Spalten, in diesem Fall gibt es insgesamt 630, 35, 20
-> Breite der Spalte (beachten Sie, dass Sie die Länge hinzufügen müssen\033[96m
- dies ist auch für Python eine Zeichenfolge), experimentieren Sie einfach :)>, <
-> begründen: rechts, links (gibt es auch=
zum Füllen mit Nullen)Ergebnis:
quelle
Eine leichte Abweichung von einer vorherigen Antwort (ich habe nicht genug Vertreter, um sie zu kommentieren). In der Formatbibliothek können Sie die Breite und Ausrichtung eines Elements angeben, jedoch nicht dort, wo es beginnt. Sie können also "20 Spalten breit sein", aber nicht "In Spalte 20 beginnen". Was zu diesem Problem führt:
Ausgabe
Die Antwort ist natürlich, auch die Literalzeichenfolgen zu formatieren, was sich etwas seltsam mit dem Format verbindet:
Ausgabe
quelle
Ich fand diese Antwort super hilfreich und elegant, ursprünglich von hier :
Ausgabe
quelle
Hier ist eine Variation der Antwort von Shawn Chin. Die Breite ist pro Spalte festgelegt, nicht über alle Spalten. Es gibt auch einen Rand unterhalb der ersten Zeile und zwischen den Spalten. (Die icontract- Bibliothek wird zur Durchsetzung der Verträge verwendet.)
Hier ist ein Beispiel:
quelle
@Franck Dernoncourt ausgefallenes Rezept aktualisiert, um Python 3 und PEP8 kompatibel zu sein
quelle
Mir ist klar, dass diese Frage alt ist, aber ich habe Antaks Antwort nicht verstanden und wollte keine Bibliothek verwenden, also habe ich meine eigene Lösung entwickelt.
Die Lösung geht davon aus, dass Datensätze ein 2D-Array sind, dass Datensätze alle dieselbe Länge haben und dass alle Felder Zeichenfolgen sind.
quelle