Bagaimana saya bisa mencetak kamus dengan kedalaman ~ 4 dengan Python? Saya mencoba mencetak dengan cantik pprint()
, tetapi tidak berhasil:
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(mydict)
Saya hanya ingin lekukan ("\t"
) untuk setiap sarang, sehingga saya mendapatkan sesuatu seperti ini:
key1
value1
value2
key2
value1
value2
dll.
Bagaimana saya bisa melakukan ini?
python
dictionary
martineau
sumber
sumber
Jawaban:
Saya tidak yakin bagaimana persisnya Anda ingin formatnya terlihat, tetapi Anda bisa mulai dengan fungsi seperti ini:
sumber
__future__
yang dijawab oleh jawabannya sekarang, jadi Anda harus menggunakan yang mana pun dibutuhkan (atau sudah perbarui ke 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}")
Pikiran pertama saya adalah bahwa serializer JSON mungkin cukup bagus di kamus bersarang, jadi saya akan menipu dan menggunakannya:
sumber
Anda dapat mencoba YAML melalui PyYAML . Keluarannya dapat disesuaikan. Saya sarankan mulai dengan yang berikut ini:
print yaml.dump(data, allow_unicode=True, default_flow_style=False)
Hasilnya sangat mudah dibaca; itu juga dapat diurai kembali ke Python jika diperlukan.
Edit:
Contoh:
sumber
float
dannumpy.float64
Seperti yang telah dilakukan, saya tidak melihat ada printer cantik yang setidaknya meniru output interpreter python dengan format yang sangat sederhana jadi inilah milik saya:
Untuk menginisialisasi:
Itu dapat mendukung penambahan formatters untuk tipe yang didefinisikan, Anda hanya perlu membuat fungsi untuk yang seperti ini dan mengikatnya ke tipe yang Anda inginkan dengan set_formater:
Untuk alasan historis, saya menyimpan printer cantik sebelumnya yang merupakan fungsi alih-alih kelas, tetapi keduanya dapat digunakan dengan cara yang sama, versi kelas hanya mengizinkan lebih banyak:
Untuk menggunakannya:
Dibandingkan dengan versi lain:
sumber
dengan cara ini Anda dapat mencetaknya dengan cara yang sama misalnya dengan nama kamus Anda yasin
sumber
Opsi lain dengan
yapf
:Keluaran:
sumber
Seperti yang telah diposting orang lain, Anda dapat menggunakan rekursi / dfs untuk mencetak data kamus bersarang dan menelepon secara rekursif jika itu adalah kamus; jika tidak, cetak data.
sumber
Salah satu cara paling pythonic untuk itu adalah dengan menggunakan modul print yang sudah dibangun .
Argumen yang Anda butuhkan untuk menentukan kedalaman cetak adalah seperti yang Anda harapkan
depth
Itu dia !
sumber
cemberut dapat mencetak apa saja yang Anda lemparkan padanya, misalnya (meminjam
data
dari jawaban lain):akan menghasilkan output yang dicetak ke layar seperti:
atau Anda dapat mengembalikan output string yang diformat dari objek Anda:
Kasus penggunaan utamanya adalah untuk debugging sehingga tidak tersumbat pada instance objek atau apa pun dan menangani output unicode seperti yang Anda harapkan, bekerja di python 2.7 dan 3.
pengungkapan : Saya penulis dan pengelola cibiran.
sumber
Saya mengambil jawaban sth dan memodifikasinya sedikit agar sesuai dengan kebutuhan saya akan kamus dan daftar yang bersarang:
Yang kemudian memberi saya output seperti:
sumber
Sth, aku tenggelam itu cantik;)
sumber
list
nilai yang bukandict
instance, yaitupretty({'key': [1, 2, 3]}, indent=4)
==>AttributeError: 'int' object has no attribute 'iteritems'
. Saya juga tidak suka kunci huruf besar.sumber
Saya menulis kode sederhana ini untuk mencetak struktur umum objek json dengan Python.
hasil untuk data berikut
sangat kompak dan terlihat seperti ini:
sumber
Saya seorang pemula python relatif sendiri tetapi saya telah bekerja dengan kamus bersarang selama beberapa minggu terakhir dan ini adalah apa yang saya hasilkan.
Anda harus mencoba menggunakan tumpukan. Buat kunci dari kamus root menjadi daftar daftar:
Dengan urutan terbalik dari yang terakhir ke yang pertama, cari setiap kunci dalam kamus untuk melihat apakah nilainya adalah (juga) kamus. Jika tidak, cetak kunci lalu hapus. Namun jika nilai untuk kuncinya adalah kamus, cetak kunci lalu tambahkan kunci untuk nilai itu ke akhir tumpukan, dan mulailah memproses daftar itu dengan cara yang sama, ulangi secara berulang untuk setiap daftar kunci yang baru.
Jika nilai untuk kunci kedua di setiap daftar adalah kamus, Anda akan memiliki sesuatu seperti ini setelah beberapa putaran:
Keuntungan dari pendekatan ini adalah bahwa indentasi hanya beberapa
\t
kali panjang tumpukan:The downside adalah bahwa untuk memeriksa setiap kunci yang Anda perlu hash melalui sub-kamus yang relevan, meskipun ini dapat ditangani dengan mudah dengan pemahaman daftar dan
for
loop sederhana :Ketahuilah bahwa pendekatan ini akan mengharuskan Anda untuk membersihkan daftar yang kosong, dan untuk menghapus kunci terakhir dalam daftar yang diikuti oleh daftar kosong (yang tentu saja dapat membuat daftar kosong lain, dan sebagainya).
Ada cara lain untuk menerapkan pendekatan ini, tetapi mudah-mudahan ini memberi Anda ide dasar tentang bagaimana melakukannya.
EDIT: Jika Anda tidak ingin melalui semua itu,
pprint
modul mencetak kamus bersarang dalam format yang bagus.sumber
Inilah fungsi yang saya tulis berdasarkan komentar sth. Ini berfungsi sama dengan json.dumps dengan indent, tapi saya menggunakan tab bukan ruang untuk indentasi. Di Python 3.2+ Anda bisa menentukan indentasi menjadi '\ t' secara langsung, tetapi tidak di 2.7.
Ex:
sumber
Berikut adalah sesuatu yang akan mencetak segala jenis kamus bersarang, sambil terus melacak kamus "induk".
Ini adalah titik awal yang baik untuk mencetak sesuai format yang berbeda, seperti yang ditentukan dalam OP. Yang perlu Anda lakukan hanyalah operasi di sekitar blok Cetak . Perhatikan bahwa ini terlihat untuk melihat apakah nilainya adalah 'OrderedDict ()'. Bergantung pada apakah Anda menggunakan sesuatu dari Koleksi tipe data Container , Anda harus membuat semacam brankas ini sehingga blok elif tidak melihatnya sebagai kamus tambahan karena namanya. Sampai sekarang, kamus contoh suka
akan dicetak
~ mengubah kode agar sesuai dengan format pertanyaan ~
Menggunakan kode contoh yang sama, itu akan mencetak yang berikut:
Ini bukan persis apa yang diminta dalam OP. Perbedaannya adalah bahwa orangtua masih dicetak, bukannya tidak ada dan diganti dengan ruang putih. Untuk sampai ke format OP, Anda harus melakukan sesuatu seperti berikut ini: bandingkan iteratif dengan dicList dengan lastDict . Anda dapat melakukan ini dengan membuat kamus baru dan menyalin konten dicList untuk itu, memeriksa apakah saya dalam kamus disalin adalah sama seperti saya di lastDict, dan - jika - menulis spasi dengan yang saya posisi menggunakan fungsi string yang multiplier .
sumber
Dari tautan ini :
sumber
Saya hanya kembali ke pertanyaan ini setelah mengambil jawaban sth dan membuat modifikasi kecil tapi sangat berguna. Fungsi ini mencetak semua kunci di pohon JSON serta ukuran simpul daun di pohon itu.
Sangat menyenangkan ketika Anda memiliki objek JSON besar dan ingin mengetahui di mana dagingnya. Contoh :
Ini akan memberi tahu Anda bahwa sebagian besar data yang Anda pedulikan mungkin ada di dalam
JSON_object['key1']['key2']['value2']
karena panjang nilai yang diformat sebagai string sangat besar.sumber
Gunakan fungsi ini:
Sebut saja seperti ini:
sumber
Inilah yang saya buat ketika mengerjakan kelas yang perlu menulis kamus dalam file .txt:
Sekarang, jika kita memiliki kamus seperti ini:
Dan kami melakukannya:
Kita mendapatkan:
sumber