Jak mogę ładnie wydrukować słownik o głębokości ~ 4 w Pythonie? Próbowałem ładnego drukowania pprint()
, ale to nie działało:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Chcę po prostu wcięcia ( "\t"
) dla każdego zagnieżdżenia, aby uzyskać coś takiego:
key1
value1
value2
key2
value1
value2
itp.
W jaki sposób mogę to zrobić?
python
dictionary
martineau
źródło
źródło
Odpowiedzi:
Nie jestem pewien, jak dokładnie powinno wyglądać formatowanie, ale możesz zacząć od takiej funkcji:
źródło
__future__
, teraz wspomniana odpowiedź, więc musisz zatrudnić te tam, gdzie są potrzebne (lub zaktualizować już do 3).python def pretty(d, indent=0): for key, value in d.items(): if isinstance(value, dict): print(' ' * indent + str(key)) pretty(value, indent+1) else: print(' ' * (indent+1) + f"{key}: {value}")
Moją pierwszą myślą było to, że serializator JSON jest prawdopodobnie całkiem dobry w zagnieżdżonych słownikach, więc oszukiwałbym i używał tego:
źródło
Możesz spróbować YAML przez PyYAML . Jego wydajność można precyzyjnie dostroić. Proponuję zacząć od następującego:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
Wynik jest bardzo czytelny; w razie potrzeby można go również przeanalizować z powrotem do Pythona.
Edytować:
Przykład:
źródło
float
i anumpy.float64
Co do tego, co zostało zrobione, nie widzę żadnej ładnej drukarki, która przynajmniej naśladuje wyjście interpretera Pythona z bardzo prostym formatowaniem, więc oto moje:
Aby zainicjować:
Może obsługiwać dodawanie formatererów dla zdefiniowanych typów, wystarczy utworzyć funkcję dla takiej jak ta i powiązać ją z wybranym typem za pomocą set_formater:
Ze względów historycznych zachowuję poprzednią ładną drukarkę, która była funkcją zamiast klasy, ale oba mogą być używane w ten sam sposób, wersja klasowa po prostu pozwala na znacznie więcej:
Aby go użyć:
W porównaniu do innych wersji:
źródło
w ten sposób możesz wydrukować go w ładny sposób, na przykład nazwa twojego słownika to yasin
źródło
Inna opcja z
yapf
:Wynik:
źródło
Jak napisali inni, możesz użyć rekurencji / dfs, aby wydrukować dane zagnieżdżonego słownika i wywołać rekurencyjnie, jeśli jest to słownik; w przeciwnym razie wydrukuj dane.
źródło
Jednym z najbardziej pythonicznych sposobów jest użycie już zbudowanego modułu pprint .
Argument potrzebny do zdefiniowania głębokości drukowania jest taki, jak można się spodziewać
depth
Otóż to !
źródło
pout może całkiem wydrukować wszystko, co na niego rzucisz, na przykład (pożyczanie
data
z innej odpowiedzi):spowoduje wydrukowanie na ekranie wyników takich jak:
lub możesz zwrócić sformatowany ciąg wyjściowy swojego obiektu:
Jego podstawowym przypadkiem użycia jest debugowanie, więc nie dusi się na instancjach obiektów ani niczego, i obsługuje wyjście Unicode tak, jak można się spodziewać, działa w Pythonie 2.7 i 3.
ujawnienie : Jestem autorem i opiekunem pout.
źródło
Wziąłem odpowiedź sth i nieznacznie ją zmodyfikowałem, aby pasowała do moich potrzeb zagnieżdżonych słowników i list:
Co daje mi dane wyjściowe takie jak:
źródło
Cóż, tonę to ładnie;)
źródło
list
wartości, które nie sądict
instancjami, tj.pretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Nie podobają mi się także duże klawisze.źródło
Napisałem ten prosty kod, aby wydrukować ogólną strukturę obiektu json w Pythonie.
wynik dla następujących danych
jest bardzo kompaktowy i wygląda następująco:
źródło
Sam jestem względnym nowicjuszem w Pythonie, ale przez ostatnie kilka tygodni pracowałem z zagnieżdżonymi słownikami i właśnie to wymyśliłem.
Powinieneś spróbować użyć stosu. Przekształć klucze ze słownika głównego w listę:
Przechodząc w odwrotnej kolejności od ostatniej do pierwszej, wyszukaj każdy klucz w słowniku, aby sprawdzić, czy jego wartością jest (także) słownik. Jeśli nie, wydrukuj klucz, a następnie usuń go. Jeśli jednak wartością klucza jest słownik, wydrukuj klucz, a następnie dołącz klucze dla tej wartości na końcu stosu i rozpocznij przetwarzanie tej listy w ten sam sposób, powtarzając rekurencyjnie dla każdej nowej listy kluczy.
Jeśli wartością drugiego klucza na każdej liście byłby słownik, po kilku rundach miałbyś coś takiego:
Zaletą tego podejścia jest to, że wcięcie jest tylko
\t
wielokrotnością długości stosu:Minusem jest to, że aby sprawdzić każdy klucz, musisz przejść do odpowiedniego słownika podrzędnego, chociaż można to łatwo rozwiązać za pomocą zrozumienia listy i prostej
for
pętli:Należy pamiętać, że takie podejście wymaga oczyszczenia końcowych pustych list i usunięcia ostatniego klucza z dowolnej listy, po której następuje pusta lista (co oczywiście może stworzyć kolejną pustą listę itd.).
Istnieją inne sposoby wdrożenia tego podejścia, ale mam nadzieję, że daje to podstawowe wyobrażenie o tym, jak to zrobić.
EDYCJA: Jeśli nie chcesz przez to wszystko przechodzić,
pprint
moduł drukuje zagnieżdżone słowniki w ładnym formacie.źródło
Oto funkcja, którą napisałem na podstawie komentarza. Działa tak samo jak json.dumps z wcięciem, ale używam tabulatorów zamiast spacji dla wcięć. W Python 3.2+ można określić wcięcie bezpośrednio jako „\ t”, ale nie w wersji 2.7.
Dawny:
źródło
Oto coś, co wydrukuje dowolny zagnieżdżony słownik, jednocześnie śledząc po drodze słowniki „nadrzędne”.
To dobry punkt wyjścia do drukowania w różnych formatach, takich jak ten określony w OP. Wszystko, co naprawdę musisz zrobić, to operacje wokół bloków drukowania . Zauważ, że wygląda na to, czy wartość to „OrdersDict ()”. W zależności od tego, czy używasz czegoś z kolekcji typów danych kontenerów , powinieneś zrobić takie zabezpieczenia, aby blok elif nie widział tego jako dodatkowego słownika ze względu na jego nazwę. Na razie przykładowy słownik
wydrukuje
~ modyfikowanie kodu w celu dopasowania do formatu pytania ~
Korzystając z tego samego przykładowego kodu, wydrukuje następujące:
Nie jest to dokładnie to , czego wymaga OP. Różnica polega na tym, że nadrzędny ^ n jest nadal drukowany, zamiast być nieobecny i zastąpiony spacją. Aby dostać się do formatu OP, musisz zrobić coś takiego: iteracyjnie porównać dicList z lastDict . Możesz to zrobić, tworząc nowy słownik i kopiując do niego zawartość dicList, sprawdzając, czy i w skopiowanym słowniku jest taki sam jak i w lastDict, i - jeśli tak - zapisując białe spacje w tej pozycji i, używając funkcji mnożnika łańcucha .
źródło
Z tego linku :
źródło
Właśnie wracam do tego pytania po otrzymaniu odpowiedzi na coś i wprowadzeniu małej, ale bardzo przydatnej modyfikacji. Ta funkcja drukuje wszystkie klucze w drzewie JSON, a także wielkość węzłów liści w tym drzewie.
To naprawdę miłe, gdy masz duże obiekty JSON i chcesz dowiedzieć się, gdzie jest mięso. Przykład :
To by powiedziało, że większość danych, na których Ci zależy, prawdopodobnie znajduje się w środku,
JSON_object['key1']['key2']['value2']
ponieważ długość tej wartości sformatowanej jako ciąg jest bardzo duża.źródło
Użyj tej funkcji:
Nazwij to tak:
źródło
Oto, co wymyśliłem, pracując nad klasą, która musiała napisać słownik w pliku .txt:
Teraz, jeśli mamy taki słownik:
I robimy:
Otrzymujemy:
źródło