Saya suka modul pprint dengan Python. Saya sering menggunakannya untuk pengujian dan debugging. Saya sering menggunakan opsi lebar untuk memastikan keluarannya pas dengan jendela terminal saya.
Ini berfungsi dengan baik sampai mereka menambahkan jenis kamus yang dipesan baru dengan Python 2.7 (fitur keren lain yang sangat saya suka). Jika saya mencoba untuk mencetak kamus yang dipesan dengan cantik, itu tidak ditampilkan dengan baik. Alih-alih menempatkan setiap pasangan nilai kunci di barisnya sendiri, semuanya muncul dalam satu baris panjang, yang membungkus berkali-kali dan sulit dibaca.
Apakah ada orang di sini yang memiliki cara untuk membuatnya tercetak dengan baik, seperti kamus lama yang tidak berurutan? Saya mungkin bisa menemukan sesuatu, mungkin menggunakan metode PrettyPrinter.format, jika saya menghabiskan cukup waktu, tetapi saya bertanya-tanya apakah ada orang di sini yang sudah mengetahui solusinya.
UPDATE: Saya mengajukan laporan bug untuk ini. Anda bisa melihatnya di http://bugs.python.org/issue10592 .
sumber
Jawaban:
Sebagai solusi sementara, Anda dapat mencoba membuang dalam format JSON. Anda kehilangan beberapa jenis informasi, tapi kelihatannya bagus dan menjaga ketertiban.
sumber
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
berfungsi dengan baik jika Anda tidak peduli dengan urutan kunci. Secara pribadi, saya berharap__repr__
forOrderedDict
akan menghasilkan output seperti ini tetapi mempertahankan urutan kuncinya.Berikut ini akan berfungsi jika urutan OrderedDict Anda adalah alfa, karena pprint akan mengurutkan dict sebelum dicetak.
sumber
dict
harus menghindari masalah segala sesuatu ditempatkan pada satu baris.Berikut jawaban lain yang bekerja dengan mengesampingkan dan menggunakan
pprint()
fungsi stok secara internal. Tidak seperti yang saya sebelumnya, ia akan menanganiOrderedDict
di dalam wadah lain seperti alist
dan juga harus dapat menangani setiap argumen kata kunci opsional yang diberikan - namun itu tidak memiliki tingkat kontrol yang sama atas keluaran yang diberikan yang lain.Ini beroperasi dengan mengarahkan output fungsi stok ke buffer sementara dan kemudian kata membungkusnya sebelum mengirimnya ke aliran output. Meskipun hasil akhir yang dihasilkan tidak luar biasa cantik, ini layak dan mungkin "cukup baik" untuk digunakan sebagai solusi.
Perbarui 2.0
Disederhanakan dengan menggunakan
textwrap
modul pustaka standar , dan dimodifikasi untuk bekerja dengan Python 2 & 3.Output sampel:
»
{'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)])]
sumber
Untuk mencetak dikt yang dipesan, mis
Saya lakukan
Hasil yang mana
atau
yang menghasilkan
sumber
Berikut cara yang meretas implementasi
pprint
.pprint
mengurutkan kunci sebelum mencetak, jadi untuk menjaga ketertiban, kita hanya perlu membuat kunci menyortir sesuai keinginan kita.Perhatikan bahwa ini memengaruhi
items()
fungsi. Jadi, Anda mungkin ingin mempertahankan dan memulihkan fungsi yang diganti setelah melakukan pencetakan.sumber
Inilah pendekatan saya untuk cukup mencetak OrderedDict
Jika Anda ingin cukup mencetak kamus dengan kunci dalam urutan yang diurutkan
sumber
python3
. Silakan periksaIni cukup kasar, tetapi saya hanya perlu cara untuk memvisualisasikan struktur data yang terdiri dari Pemetaan dan Iterabel sembarang dan inilah yang saya temukan sebelum menyerah. Ini rekursif, jadi itu akan jatuh melalui struktur dan daftar bersarang dengan baik. Saya menggunakan kelas dasar Mapping dan abstrak Iterable dari koleksi untuk menangani apa saja.
Saya bertujuan untuk menghasilkan output yang hampir seperti yaml dengan kode python yang ringkas, tetapi tidak cukup berhasil.
dan beberapa data pengujian menggunakan OrderedDict dan daftar OrderedDicts ... (Sheesh Python sangat membutuhkan literal OrderedDict ...)
menghasilkan keluaran berikut:
Saya memiliki beberapa pemikiran selama menggunakan str.format () untuk penyelarasan yang lebih baik, tetapi tidak merasa ingin menggalinya. Anda perlu menentukan lebar bidang secara dinamis tergantung pada jenis perataan yang Anda inginkan, yang akan menjadi rumit atau tidak praktis.
Bagaimanapun, ini menunjukkan kepada saya data saya dalam mode hierarki yang dapat dibaca, jadi itu berhasil untuk saya!
sumber
Ini dia ^^
atau
sumber
pprint_od()
fungsi tidak bekerja -for key, item in od
hasil pernyataan dalamValueError: too many values to unpack
dan satu-satunya keluaran menjorok adalah final" }"
dan yangkey, item
dalamprint
kebutuhan pernyataan berada di kurung. Ini dia ^^Saya telah menguji peretasan berbasis tambalan monyet yang tidak suci ini di python3.5 dan berhasil:
Anda
pprint
menggunakan ringkasan berbasis dict biasa dan juga menonaktifkan pengurutan selama panggilan sehingga tidak ada kunci yang benar-benar diurutkan untuk dicetak.sumber
pretty_print.py
sebagai modul lokal dan meretasnya (menghapussorted
panggilan atau apa pun yang Anda inginkan).Pada Python 3.8:
pprint.PrettyPrinter
mengekspos filesort_dicts
parameter kata kunci.True secara default, menyetelnya ke False akan membuat kamus tidak diurutkan.
Akan menghasilkan:
Referensi: https://docs.python.org/3/library/pprint.html
sumber
The
pprint()
Metode hanya menyerukan__repr__()
metode hal di dalamnya, danOrderedDict
tidak muncul untuk berbuat banyak dalam metode itu (atau tidak memiliki satu atau sesuatu).Berikut adalah solusi murah yang seharusnya bekerja JIKA ANDA TIDAK PEDULI DENGAN PESANAN YANG TERLIHAT DI OUTPUT PPRINT , yang mungkin besar jika:
Saya benar-benar terkejut bahwa pesanan tidak dipertahankan ... ah baiklah.
sumber
Anda juga dapat menggunakan penyederhanaan jawaban kzh ini :
Ini mempertahankan urutan dan akan menghasilkan hampir sama dengan jawaban webwurst ( cetak melalui json dump ).
sumber
Untuk python <3.8 (misalnya 3.6):
Monyet Patch
pprint
Inisorted
untuk mencegah dari penyortiran. Ini akan mendapatkan keuntungan dari semua yang bekerja secara rekursif juga, dan lebih cocok daripadajson
opsi untuk siapa pun yang perlu menggunakan misalnyawidth
parameter:Edit: bersih-bersih
Untuk membersihkan setelah bisnis kotor ini jalankan saja:
pprint.sorted = sorted
Untuk solusi yang benar-benar bersih bahkan dapat menggunakan pengelola konteks:
sumber
Anda dapat mendefinisikan ulang
pprint()
dan mencegat panggilan untukOrderedDict
. Berikut ilustrasi sederhana. Seperti ditulis,OrderedDict
kode menimpa mengabaikan setiap opsionalstream
,indent
,width
, ataudepth
kata kunci yang mungkin telah berlalu, namun dapat ditingkatkan untuk melaksanakannya. Sayangnya teknik ini tidak menangani mereka di dalam wadah lain, sepertilist
dariOrderDict
'ssumber
Jika item kamus semuanya dari satu jenis, Anda dapat menggunakan pustaka penanganan data yang menakjubkan
pandas
:atau
sumber