Come stampare un elenco in Python "bene"


92

In PHP, posso farlo:

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

In Python, attualmente faccio solo questo:

print the_list

Tuttavia, questo causerà una grande quantità di dati. C'è un modo per stamparlo bene in un albero leggibile? (con trattini)?

Risposte:


173
from pprint import pprint
pprint(the_list)

Come stampare bene un file?
Mawg dice di reintegrare Monica il

5
Perché non basta usare import pprint?
clankill3r

19
@ clankill3r, quindi devi usarlo di pprint.pprint(the_list)solito è solo una questione di preferenze personali. In questo caso ho scelto di avere il disordine extra nella riga di importazione.
John La Rooy

2
@Mawg, puoi specificare un flusso di output usando stream=, il valore predefinito è stdout. docs.python.org/3/library/pprint.html
John La Rooy

È abilitato per impostazione predefinita in Ipython REPL
azzamsa

32

Un rapido trucco durante il debug che funziona senza dover importare pprintsarebbe quello di unirsi alla lista su '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg

TypeError quando l'elenco contiene None.
Noumenon

Soluzione semplice e può essere formattato come "" list: * {} ". Format ('\ n *' .join (lst))
dannydedog

quando la tua lista contiene qualcosa di diverso dalle stringhe che dovresti fareprint '\n'.join(map(str, lst))
spirito

25

Semplicemente "scompattando" l'elenco nell'argomento della funzione di stampa e utilizzando una nuova riga (\ n) come separatore.

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

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

foo
bar
spam
egg

2
Bello ma sfortunatamente disponibile solo in Python 3.
Anthony Labarre

1
Se ne hai davvero bisogno in Python 2.7, potresti comunque importare la funzione di stampa da futuro from __future__ import print_function Grazie per il commento.
MarcoP

21

Vuoi dire qualcosa come ...:

>>> 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']
>>> 

...? Dalla tua rapida descrizione, il modulo della libreria standard pprint è la prima cosa che ti viene in mente; tuttavia, se puoi descrivere input e output di esempio (in modo da non dover imparare PHP per aiutarti ;-), potrebbe essere possibile per noi offrire un aiuto più specifico!


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

Produzione:

[
    "one",
    "two",
    "three",
    "four"
]

Questo è perfetto. Stavo solo cercando questo
Lucifer

2

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

Se hai bisogno del testo (per l'utilizzo con curses, ad esempio):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Quindi myTextvariabile sarà qualcosa di simile a php var_dumpo print_r. Controlla la documentazione per ulteriori opzioni, argomenti.


2

Come suggeriscono le altre risposte, il modulo pprint fa il trucco.
Tuttavia, in caso di debug in cui potrebbe essere necessario inserire l'intero elenco in un file di registro, potrebbe essere necessario utilizzare il metodo pformat insieme alla registrazione del modulo insieme a 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))

E se è necessario registrarlo direttamente in un file, è necessario specificare un flusso di output, utilizzando la parola chiave stream. Rif

from pprint import pprint

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

Vedi la risposta di Stefano Sanfilippo


2

Per Python 3 , faccio lo stesso genere di cose della risposta di shxfee :

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

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

quali uscite

foo
bar
baz

Per inciso, utilizzo una funzione di supporto simile per vedere rapidamente le colonne in un DataFrame panda

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

0

Come altre risposte hanno già detto, pprintè un ottimo modulo che farà quello che vuoi. Tuttavia, se non vuoi importarlo e vuoi solo stampare l'output di debug durante lo sviluppo, puoi approssimarne l'output.

Alcune delle altre risposte funzionano bene per le stringhe, ma se le provi con un oggetto di classe ti darà l'errore TypeError: sequence item 0: expected string, instance found.

Per oggetti più complessi, assicurati che la classe abbia un __repr__metodo che stampa le informazioni sulla proprietà che desideri:

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

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

E poi, quando vuoi stampare l'output, mappare semplicemente l'elenco alla strfunzione in questo modo:

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

uscite:

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

Puoi anche fare cose come sovrascrivere il __repr__metodo dilist per ottenere una forma di bella stampa annidata:

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

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

Purtroppo nessun rientro di secondo livello ma per un veloce debug può essere utile.


0

puoi anche scorrere l'elenco:

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

x = ["1",1,"a",8]
fun()

Ciao! Si prega di formattare il codice, così com'è, non è facile da seguire. Inoltre, global non è pensato per essere usato in questo modo in Python. Vedi stackoverflow.com/questions/423379/…
Valentino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.