Podoba mi się moduł pprint w Pythonie. Często go używam do testowania i debugowania. Często używam opcji szerokości, aby upewnić się, że wyjście dobrze pasuje do mojego okna terminala.
Działało dobrze, dopóki nie dodali nowego uporządkowanego typu słownika w Pythonie 2.7 (kolejna fajna funkcja, którą bardzo lubię). Jeśli spróbuję dobrze wydrukować uporządkowany słownik, nie wyświetla się on ładnie. Zamiast umieszczać każdą parę klucz-wartość w osobnym wierszu, całość pojawia się w jednym długim wierszu, który zawija się wiele razy i jest trudny do odczytania.
Czy ktoś tutaj ma sposób, aby ładnie wydrukować, jak stare nieuporządkowane słowniki? Prawdopodobnie mógłbym coś wymyślić, prawdopodobnie używając metody PrettyPrinter.format, jeśli spędzę wystarczająco dużo czasu, ale zastanawiam się, czy ktoś tutaj zna już rozwiązanie.
AKTUALIZACJA: Złożyłem w tej sprawie raport o błędzie. Możesz to zobaczyć pod adresem http://bugs.python.org/issue10592 .
źródło
Odpowiedzi:
W ramach tymczasowego obejścia możesz spróbować zrzucić zawartość w formacie JSON. Tracisz informacje o typie, ale wygląda to ładnie i zachowuje kolejność.
źródło
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
działa dobrze, jeśli nie zależy Ci na kolejności kluczy. Osobiście chciałbym, żeby__repr__
forOrderedDict
działał w ten sposób, ale zachował kolejność kluczy.Poniższe będą działać, jeśli kolejność twojego OrderedDict jest sortowaniem alfa, ponieważ pprint posortuje dict przed wydrukowaniem.
źródło
dict
powinna uniknąć problemu umieszczania wszystkiego w jednej linii.Oto kolejna odpowiedź, która działa, zastępując i używając
pprint()
wewnętrznie funkcji giełdy . W przeciwieństwie do mojego wcześniejszego , będzie obsługiwałOrderedDict
zawartość innego kontenera, takiego jak a,list
i powinien być w stanie obsłużyć wszelkie podane opcjonalne argumenty słów kluczowych - jednak nie ma takiego samego stopnia kontroli nad danymi wyjściowymi, jak ten drugi.Działa na zasadzie przekierowania wyjścia funkcji stock do tymczasowego bufora, a następnie zawija je przed wysłaniem do strumienia wyjściowego. Chociaż ostateczny wynik nie jest wyjątkowo ładny, jest przyzwoity i może być „wystarczająco dobry”, aby można go było użyć jako obejścia.
Aktualizacja 2.0
Uproszczony przy użyciu standardowego
textwrap
modułu bibliotecznego i zmodyfikowany do pracy w Pythonie 2 i 3.Przykładowe dane wyjściowe:
»
{'john': 1, 'mary': 3, 'paul': 2}
»
OrderedDict([('john', 1), ('paul', 2),
('mary', 3)])
»
[OrderedDict([('john', 1), ('paul', 2),
('mary', 3)]), OrderedDict([('moe', 1),
('curly', 2), ('larry', 3)]),
OrderedDict([('weapons', 1), ('mass',
2), ('destruction', 3)])]
źródło
Aby wydrukować zamówiony dykt, np
ja robię
Co daje
lub
która daje
źródło
Oto sposób, w jaki hakuje implementację
pprint
.pprint
sortuje klucze przed wydrukowaniem, więc aby zachować porządek, musimy tylko uporządkować klucze w dowolny sposób.Zwróć uwagę, że ma to wpływ na
items()
funkcję. Możesz więc chcieć zachować i przywrócić nadpisane funkcje po wykonaniu polecenia pprint.źródło
Oto moje podejście do ładnego wydrukowania OrderedDict
Jeśli chcesz ładnie wydrukować słownik z kluczami w posortowanej kolejności
źródło
python3
. Proszę sprawdzićTo dość prymitywne, ale potrzebowałem tylko sposobu na wizualizację struktury danych składającej się z dowolnych mapowań i elementów iterowalnych i właśnie to wymyśliłem, zanim się poddałem. Jest rekurencyjny, więc dobrze przechodzi przez zagnieżdżone struktury i listy. Użyłem abstrakcyjnych klas bazowych Mapping i Iterable z kolekcji do obsługi prawie wszystkiego.
Miałem na celu uzyskanie prawie yamlowego wyjścia ze zwięzłym kodem Pythona, ale nie do końca mi się to udało.
i trochę danych testowych przy użyciu OrderedDict i list OrderedDicts ... (sheesh Python bardzo potrzebuje literałów OrderedDict ...)
daje następujący wynik:
Miałem kilka myśli po drodze użycia str.format () w celu lepszego wyrównania, ale nie miałem ochoty się w to zagłębiać. Konieczne byłoby dynamiczne określanie szerokości pól w zależności od typu wyrównania, które chcesz, co byłoby trudne lub uciążliwe.
W każdym razie to pokazuje mi moje dane w czytelny sposób hierarchiczny, więc to działa dla mnie!
źródło
Proszę bardzo ^^
lub
źródło
pprint_od()
funkcja nie działa - tofor key, item in od
wyniki instrukcja wValueError: too many values to unpack
i jedyne wyjście wcięty jest ostateczna" }"
ikey, item
wprint
potrzebie oświadczeniu, które zostanie w nawiasach. Proszę bardzo ^^Przetestowałem ten przeklęty hack oparty na małpach na pythonie 3.5 i działa:
Używasz
pprint
zwykłego podsumowania opartego na dyktowaniu, a także wyłączasz sortowanie na czas trwania połączenia, aby żadne klucze nie były faktycznie sortowane do drukowania.źródło
pretty_print.py
jako moduł lokalny i zhakować go (usunąćsorted
połączenie lub cokolwiek chcesz).Od Pythona 3.8:
pprint.PrettyPrinter
udostępniasort_dicts
parametr słowa kluczowego.Domyślnie prawda , ustawienie wartości False spowoduje, że słownik będzie nieposortowany.
Wyświetli:
Źródła: https://docs.python.org/3/library/pprint.html
źródło
pprint()
Metoda jest po prostu wywołując__repr__()
metodę rzeczy w nim, aOrderedDict
nie wydaje się zrobić wiele w jego metodzie (lub nie posiada jedną lub coś).Oto tanie rozwiązanie, które powinno zadziałać, JEŚLI NIE DBASZ O KOLEJNOŚĆ WIDOCZNĄ NA WYJŚCIU PPRINT , co może być duże, jeśli:
Właściwie jestem zaskoczony, że zamówienie nie jest zachowane ... no cóż.
źródło
Możesz również użyć tego uproszczenia odpowiedzi kzh :
Zachowuje kolejność i wyświetla prawie to samo, co odpowiedź Webwurst ( drukowanie przez zrzut json ).
źródło
Dla Pythona <3,8 (np. 3,6):
Monkey patch
pprint
masorted
na celu zapobieżenie sortowaniu. Będzie to miało tę zaletę, że wszystko działa również rekurencyjnie i jest bardziej odpowiednie niżjson
opcja dla każdego, kto potrzebuje np.width
Parametru:Edycja: sprzątanie
Aby posprzątać po tym brudnym biznesie, po prostu uruchom:
pprint.sorted = sorted
Aby uzyskać naprawdę czyste rozwiązanie, można nawet użyć menedżera kontekstu:
źródło
Możesz przedefiniować
pprint()
i przechwytywać połączeniaOrderedDict
. Oto prosta ilustracja. Jak napisane,OrderedDict
kod przesłanianie ignoruje wszelkie opcjonalnestream
,indent
,width
lubdepth
słowa kluczowe, które mogą być przekazywane, ale może być zwiększona w celu ich wdrożenia. Niestety technika ta nie obsługuje je w innym pojemniku, takim jaklist
zOrderDict
„sźródło
Jeśli wszystkie elementy słownika są jednego typu, możesz skorzystać z niesamowitej biblioteki do obsługi danych
pandas
:lub
źródło