Cara mencetak daftar dengan Python "dengan baik"

92

Di PHP, saya bisa melakukan ini:

echo '<pre>'
print_r($array);
echo '</pre>'

Dengan Python, saat ini saya hanya melakukan ini:

print the_list

Namun, ini akan menyebabkan jumbo data yang besar. Apakah ada cara untuk mencetaknya dengan baik menjadi pohon yang dapat dibaca? (dengan indentasi)?

TIMEX
sumber

Jawaban:

173
from pprint import pprint
pprint(the_list)
John La Rooy
sumber
Bagaimana cara cantik mencetak ke file?
Mawg mengatakan memulihkan Monica
5
Mengapa tidak digunakan saja import pprint?
clankill3r
19
@ clankill3r, maka Anda perlu menggunakan pprint.pprint(the_list)biasanya itu hanya masalah preferensi pribadi. Saya memilih untuk memiliki kekacauan ekstra di baris impor dalam kasus ini.
John La Rooy
2
@Mawg, Anda dapat menentukan aliran keluaran menggunakan stream=, defaultnya adalah stdout. docs.python.org/3/library/pprint.html
John La Rooy
Ini diaktifkan secara default di Ipython REPL
azzamsa
32

Peretasan cepat saat men-debug yang berfungsi tanpa harus mengimpor pprintadalah bergabung dengan daftar '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg
shxfee.dll
sumber
TypeError saat daftar berisi None.
Noumenon
Solusi mudah dan dapat diformat seperti `" list: * {} ". Format ('\ n *' .join (lst))
dannydedog
ketika daftar Anda berisi sesuatu selain string yang harus Anda lakukanprint '\n'.join(map(str, lst))
semangat
25

Cukup dengan "membongkar" daftar dalam argumen fungsi cetak dan menggunakan baris baru (\ n) sebagai pemisah.

cetak (* lst, sep = '\ n')

lst = ['foo', 'bar', 'spam', 'egg']
print(*lst, sep='\n')

foo
bar
spam
egg
MarcoP
sumber
2
Bagus tapi sayangnya hanya tersedia di Python 3.
Anthony Labarre
1
Jika Anda benar-benar membutuhkannya dengan Python 2.7, Anda masih dapat mengimpor fungsi cetak dari masa mendatang. from __future__ import print_function Terima kasih atas komentarnya.
MarcoP
21

Maksudmu seperti ...:

>>> print L
['this', 'is', 'a', ['and', 'a', 'sublist', 'too'], 'list', 'including', 'many', 'words', 'in', 'it']
>>> import pprint
>>> pprint.pprint(L)
['this',
 'is',
 'a',
 ['and', 'a', 'sublist', 'too'],
 'list',
 'including',
 'many',
 'words',
 'in',
 'it']
>>> 

...? Dari deskripsi sepintas Anda, pprint modul perpustakaan standar adalah hal pertama yang terlintas dalam pikiran; namun, jika Anda dapat mendeskripsikan contoh input dan output (sehingga Anda tidak perlu mempelajari PHP untuk membantu Anda ;-), kami mungkin dapat menawarkan bantuan yang lebih spesifik!

Alex Martelli
sumber
7
import json
some_list = ['one', 'two', 'three', 'four']
print(json.dumps(some_list, indent=4))

Keluaran:

[
    "one",
    "two",
    "three",
    "four"
]
Eyal Levin
sumber
Ini sempurna. Saya hanya mencari ini
Lucifer
2

https://docs.python.org/3/library/pprint.html

Jika Anda membutuhkan teks (untuk digunakan dengan kutukan misalnya):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Kemudian myTextvariabel akan mirip seperti php var_dumpatau print_r. Periksa dokumentasi untuk lebih banyak opsi, argumen.

Iacchus
sumber
2

Karena jawaban lain menyarankan modul pprint melakukan triknya.
Meskipun demikian, dalam kasus debugging di mana Anda mungkin perlu meletakkan seluruh daftar ke dalam beberapa file log, seseorang mungkin harus menggunakan metode pformat bersama dengan logging modul bersama dengan pprint.

import logging
from pprint import pformat

logger = logging.getLogger('newlogger')
handler = logging.FileHandler('newlogger.log')

formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler) 
logger.setLevel(logging.WARNING)

data = [ (i, { '1':'one',
           '2':'two',
           '3':'three',
           '4':'four',
           '5':'five',
           '6':'six',
           '7':'seven',
           '8':'eight',
           })
         for i in xrange(3)
      ]

logger.error(pformat(data))

Dan jika Anda perlu memasukkannya secara langsung ke File, seseorang harus menentukan aliran keluaran, menggunakan kata kunci aliran. Ref

from pprint import pprint

with open('output.txt', 'wt') as out:
   pprint(myTree, stream=out)

Lihat jawaban Stefano Sanfilippo

El_Diablo
sumber
2

Untuk Python 3 , saya melakukan hal yang sama seperti jawaban shxfee :

def print_list(my_list):
    print('\n'.join(my_list))

a = ['foo', 'bar', 'baz']
print_list(a)

keluaran yang mana

foo
bar
baz

Selain itu, saya menggunakan fungsi helper yang serupa untuk melihat kolom di DataFrame panda dengan cepat

def print_cols(df):
    print('\n'.join(df.columns))
aaronpenne
sumber
0

Seperti jawaban lain yang telah disebutkan, pprintini adalah modul hebat yang akan melakukan apa yang Anda inginkan. Namun jika Anda tidak ingin mengimpornya dan hanya ingin mencetak keluaran debugging selama pengembangan, Anda dapat memperkirakan keluarannya.

Beberapa dari jawaban lain berfungsi dengan baik untuk string, tetapi jika Anda mencobanya dengan objek kelas, itu akan memberi Anda kesalahan TypeError: sequence item 0: expected string, instance found.

Untuk objek yang lebih kompleks, pastikan kelas memiliki __repr__metode yang mencetak informasi properti yang Anda inginkan:

class Foo(object):
    def __init__(self, bar):
        self.bar = bar

    def __repr__(self):
        return "Foo - (%r)" % self.bar

Dan kemudian ketika Anda ingin mencetak hasilnya, cukup petakan daftar Anda ke strfungsi seperti ini:

l = [Foo(10), Foo(20), Foo("A string"), Foo(2.4)]
print "[%s]" % ",\n ".join(map(str,l))

keluaran:

 [Foo - (10),
  Foo - (20),
  Foo - ('A string'),
  Foo - (2.4)]

Anda juga bisa melakukan hal-hal seperti mengganti __repr__metode listuntuk mendapatkan bentuk pencetakan cantik bersarang:

class my_list(list):
    def __repr__(self):
        return "[%s]" % ",\n ".join(map(str, self))

a = my_list(["first", 2, my_list(["another", "list", "here"]), "last"])
print a

memberi

[first,
 2,
 [another,
 list,
 here],
 last]

Sayangnya tidak ada indentasi tingkat kedua tetapi untuk debug cepat dapat berguna.

Aaron D
sumber
0

Anda juga dapat memutar melalui daftar Anda:

def fun():
  for i in x:
    print(i)

x = ["1",1,"a",8]
fun()
vijay
sumber
Halo! Harap format kodenya, karena memang tidak mudah untuk diikuti. Selain itu, global tidak dimaksudkan untuk digunakan seperti itu di python. Lihat stackoverflow.com/questions/423379/…
Valentino