Próbuję stworzyć ładną listę kolumn w Pythonie do użytku z narzędziami administracyjnymi wiersza poleceń, które tworzę.
Po prostu chcę listę taką jak:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Zmienić się w:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Używanie zwykłych kart nie załatwi sprawy, ponieważ nie znam najdłuższych danych w każdym wierszu.
To jest to samo zachowanie, co „kolumna -t” w Linuksie.
$ 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
Rozejrzałem się za różnymi bibliotekami Pythona, aby to zrobić, ale nie mogę znaleźć nic przydatnego.
Odpowiedzi:
To powoduje obliczenie najdłuższego wpisu danych w celu określenia szerokości kolumny, a następnie użycie,
.ljust()
aby dodać niezbędne wypełnienie podczas drukowania każdej kolumny.źródło
longest
jest myląca, ponieważ nie jest to najdłuższy element, ale maksymalna długość. BTW najdłuższy może być przyjmowany z czymś takim:max((w for sub in data for w in sub), key=len)
. [PS Nie byłem tym, który przegłosował]max((w for ...), key=len)
daje najdłuższy wpis, a następnie musisz ponownie wykonać bieglen
. Nie mogłem zdecydować, które było jasne, więc utknąłem przy pierwszym. Dobra uwaga na mylącą nazwę var. Zmieniony.max(len(x) for sub in data for x in sub)
to też nie tworzy zbędnych list.column -t
robi.Od Pythona 2.6+ możesz użyć ciągu formatu w następujący sposób, aby ustawić kolumny na co najmniej 20 znaków i wyrównać tekst do prawej.
Wynik:
źródło
{: >20}
kolejne pola, aby wyświetlić więcej pólPrzyszedłem tutaj z tymi samymi wymaganiami, ale odpowiedzi @lvc i @ Preet wydają się bardziej zgodne z tym, co
column -t
produkuje w tych kolumnach o różnych szerokościach:źródło
map(len, map(str, col))
.Trochę za późno na imprezę i bezwstydna wtyczka do paczki, którą napisałem, ale możesz też sprawdzić pakiet Columnar .
Pobiera listę list danych wejściowych i listę nagłówków i wyświetla ciąg w formacie tabeli. Ten fragment kodu tworzy tabelę typu docker-esque:
Lub możesz być trochę bardziej wyszukany dzięki kolorom i obramowaniom.
Aby dowiedzieć się więcej o algorytmie ustalania wielkości kolumn i zobaczyć resztę interfejsu API, możesz sprawdzić powyższy link lub zobaczyć kolumnową repozytorium GitHub
źródło
Musisz to zrobić z 2 wejściami:
str.ljust()
istr.rjust()
źródło
Taka transpozycja kolumn to zadanie dla zip:
Aby znaleźć wymaganą długość każdej kolumny, możesz użyć
max
:Którego możesz użyć, z odpowiednim dopełnieniem, do skonstruowania ciągów do przekazania
print
:źródło
Aby uzyskać bardziej wyszukane stoły, takie jak
możesz użyć tego przepisu Pythona :
Strona z przepisami w Pythonie zawiera kilka ulepszeń.
źródło
pandas
rozwiązanie oparte na tworzeniu dataframe:Aby usunąć indeks i wartości nagłówka, aby utworzyć dane wyjściowe, możesz użyć
to_string
metody:źródło
Scolp to nowa biblioteka, która umożliwia łatwe drukowanie strumieniowych danych kolumnowych z automatyczną regulacją szerokości kolumny.
(Zastrzeżenie: jestem autorem)
źródło
To ustawia niezależne, najlepiej dopasowane szerokości kolumn na podstawie maksymalnych metryk użytych w innych odpowiedziach.
źródło
Dla leniwych
które używają Pythona 3. * i Pandas / Geopandas ; uniwersalne proste podejście w klasie (w przypadku „normalnego” skryptu wystarczy usunąć siebie ):
Funkcja kolorowania:
Nagłówek:
a następnie dane z ramki danych Pandas / Geopandas:
Znaczenie
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> kolumn, w tym przypadku jest łącznie 630, 35, 20
-> szerokość kolumny (pamiętaj, że będziesz musiał dodać długość\033[96m
- to dla Pythona też jest stringiem), po prostu eksperymentuj :)>, <
-> justify: right, left (jest też=
do wypełnienia zerami)Wynik:
źródło
Niewielka zmiana w stosunku do poprzedniej odpowiedzi (nie mam wystarczającej liczby przedstawicieli, aby to skomentować). Biblioteka formatów umożliwia określenie szerokości i wyrównania elementu, ale nie w miejscu, w którym się on zaczyna, tj. Można powiedzieć „ma szerokość 20 kolumn”, ale nie „zaczyna się w kolumnie 20”. Co prowadzi do tego problemu:
Wynik
Odpowiedzią jest oczywiście również sformatowanie ciągów literałów, co nieco dziwnie łączy się z formatem:
Wynik
źródło
Uważam, że ta odpowiedź jest bardzo pomocna i elegancka, oryginalnie stąd :
Wynik
źródło
Oto odmiana odpowiedzi Shawn Chin. Szerokość jest ustalana dla każdej kolumny, a nie dla wszystkich kolumn. Istnieje również obramowanie poniżej pierwszego rzędu i między kolumnami. ( Biblioteka ikonografów służy do egzekwowania umów).
Oto przykład:
źródło
zaktualizowany przepis @Franck Dernoncourt na zgodny z Pythonem 3 i PEP8
źródło
Zdaję sobie sprawę, że to pytanie jest stare, ale nie zrozumiałem odpowiedzi Antaka i nie chciałem korzystać z biblioteki, więc wybrałem własne rozwiązanie.
Rozwiązanie zakłada, że rekordy są tablicą 2D, wszystkie rekordy mają taką samą długość, a pola są ciągami.
źródło