Saya mencoba membuat daftar kolom yang bagus dengan python untuk digunakan dengan alat admin baris perintah yang saya buat.
Pada dasarnya, saya ingin daftar seperti:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Untuk berubah menjadi:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Menggunakan tab biasa tidak akan berhasil di sini karena saya tidak tahu data terpanjang di setiap baris.
Ini adalah perilaku yang sama dengan 'kolom -t' di Linux ..
$ 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
Saya telah mencari-cari berbagai pustaka python untuk melakukan ini tetapi tidak dapat menemukan sesuatu yang berguna.
Jawaban:
Apa yang dilakukannya adalah menghitung entri data terpanjang untuk menentukan lebar kolom, lalu gunakan
.ljust()
untuk menambahkan bantalan yang diperlukan saat mencetak setiap kolom.sumber
longest
menyesatkan karena ini bukan elemen terpanjang tapi max_length. BTW terpanjang bisa diambil dengan sesuatu seperti:max((w for sub in data for w in sub), key=len)
. [PS Saya bukan orang yang tidak suka]max((w for ...), key=len)
memberi Anda entri terpanjang dan Anda harus berlarilen
lagi. Tidak bisa memutuskan mana yang jelas jadi saya tetap dengan yang pertama. Poin bagus untuk nama var yang menyesatkan. Berubah.max(len(x) for sub in data for x in sub)
itu juga tidak membangun daftar yang tidak perlu.column -t
dilakukannya.Sejak Python 2.6+, Anda dapat menggunakan string format dengan cara berikut untuk mengatur kolom menjadi minimal 20 karakter dan meratakan teks ke kanan.
Keluaran:
sumber
{: >20}
untuk menampilkan lebih banyak bidangSaya datang ke sini dengan persyaratan yang sama tetapi jawaban @lvc dan @ Preet tampaknya lebih sejalan dengan apa yang
column -t
dihasilkan di kolom yang memiliki lebar berbeda:sumber
map(len, map(str, col))
.Ini agak terlambat ke pesta, dan steker tak tahu malu untuk paket yang saya tulis, tetapi Anda juga dapat memeriksa paket Columnar .
Dibutuhkan daftar daftar input dan daftar header dan output string berformat tabel. Cuplikan ini membuat tabel docker-esque:
Atau Anda bisa menjadi lebih mewah dengan warna dan tepian.
Untuk membaca lebih lanjut tentang algoritme ukuran kolom dan melihat API lainnya, Anda dapat melihat tautan di atas atau melihat Repo GitHub Kolom
sumber
Anda harus melakukan ini dengan 2 operan:
str.ljust()
danstr.rjust()
sumber
Mengubah urutan kolom seperti itu adalah pekerjaan untuk zip:
Untuk menemukan panjang yang dibutuhkan setiap kolom, Anda dapat menggunakan
max
:Yang dapat Anda gunakan, dengan padding yang sesuai, untuk membuat string untuk diteruskan ke
print
:sumber
Untuk mendapatkan tabel yang lebih bagus seperti
Anda dapat menggunakan resep Python ini :
The halaman Resep Python berisi beberapa perbaikan di atasnya.
sumber
pandas
solusi berbasis dengan membuat kerangka data:Untuk menghapus nilai indeks dan header untuk membuat keluaran yang Anda inginkan, Anda dapat menggunakan
to_string
metode:sumber
Scolp adalah pustaka baru yang memungkinkan Anda mencetak data kolom streaming dengan mudah sambil menyesuaikan lebar kolom secara otomatis.
(Penafian: Saya adalah penulisnya)
sumber
Ini menetapkan lebar kolom independen dan paling pas berdasarkan metrik maks yang digunakan dalam jawaban lain.
sumber
Untuk orang malas
yang menggunakan Python 3. * dan Pandas / Geopandas ; pendekatan kelas sederhana universal (untuk skrip 'normal' hapus saja sendiri ):
Fungsi mewarnai:
Header:
lalu data dari bingkai data Pandas / Geopandas:
Arti dari
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> kolom, ada total 6 dalam kasus ini30, 35, 20
-> lebar kolom (perhatikan bahwa Anda harus menambahkan panjang\033[96m
- ini untuk Python adalah string juga), coba saja :)>, <
-> ratakan: kanan, kiri (ada juga yang=
harus diisi dengan angka nol)Hasil:
sumber
Sedikit variasi pada jawaban sebelumnya (saya tidak memiliki cukup perwakilan untuk mengomentarinya). Pustaka format memungkinkan Anda menentukan lebar dan perataan elemen tetapi tidak di mana ia dimulai, yaitu, Anda dapat mengatakan "menjadi 20 kolom lebar" tetapi tidak "mulai di kolom 20". Yang mengarah ke masalah ini:
Keluaran
Jawabannya tentu saja adalah memformat string literal juga, yang menggabungkan sedikit aneh dengan format:
Keluaran
sumber
Saya menemukan jawaban ini sangat membantu dan elegan, awalnya dari sini :
Keluaran
sumber
Berikut adalah variasi dari jawaban Shawn Chin. Lebar ditetapkan per kolom, tidak di semua kolom. Ada juga batas di bawah baris pertama dan di antara kolom. ( pustaka icontract digunakan untuk memberlakukan kontrak.)
Berikut ini contohnya:
sumber
memperbarui resep mewah @Franck Dernoncourt agar sesuai dengan python 3 dan PEP8
sumber
Saya menyadari pertanyaan ini sudah lama tetapi saya tidak mengerti jawaban Antak dan tidak ingin menggunakan perpustakaan jadi saya meluncurkan solusi saya sendiri.
Solusi mengasumsikan catatan adalah larik 2D, catatan memiliki panjang yang sama, dan semua bidang adalah string.
sumber