2009-10-06 25 views
39

En PHP, puedo hacer esto:Cómo imprimir una lista en Python "muy bien"

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

En Python, que actualmente sólo hago esto:

print the_list 

Sin embargo, esto provocará una gran jumbo de datos. ¿Hay alguna manera de imprimirlo bien en un árbol legible? (con sangrías)?

Respuesta

92
from pprint import pprint 
pprint(the_list) 
+0

Cómo ot bastante imprimir en un archivo? – Mawg

+2

¿Por qué no usar simplemente 'import pprint'? – clankill3r

+7

@ clankill3r, entonces necesitas usar 'pprint.pprint (the_list)', generalmente es solo una cuestión de preferencia personal. Elegí tener el desorden extra en la línea de importación en este caso. –

17

¿Quieres decir algo como ...:

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

...? De su descripción superficial, el módulo de biblioteca estándar pprint es lo primero que se le viene a la mente; sin embargo, si puede describir entradas y salidas de ejemplo (para que no tenga que aprender PHP para ayudarlo ;-), ¡podemos ofrecerle ayuda más específica!

14

Un truco rápido durante la depuración que funciona sin tener que importar pprint sería unirse a la lista en '\n'.

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

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

Si necesita el texto (para usar con maldiciones por ejemplo):

import pprint 

myObject = [] 

myText = pprint.pformat(myObject) 

Entonces myText variable php algo igual o var_dumpprint_r. Verifique la documentación para más opciones, argumentos.

11

Simplemente "desempaquetando" la lista en el argumento de función de impresión y usando una nueva línea (\ n) como separador.

de impresión (* LST, sep = '\ n')

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

foo 
bar 
spam 
egg 
+0

Agradable pero desafortunadamente solo disponible en Python 3. –

0

Como las otras respuestas sugieren módulo pprint hace el truco.
No obstante, en caso de depuración donde es posible que deba colocar toda la lista en algún archivo de registro, puede que tenga que usar el método pformat junto con el módulo registrando junto con 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)) 

Y si tienes que entrar directamente en un archivo, se tendría que especificar un flujo de salida, usando la palabra clave corriente. Ref

from pprint import pprint 

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

Ver Stefano Sanfilippo's answer

0

Como han mencionado otras respuestas, pprint es un gran módulo que va a hacer lo que quiera. Sin embargo, si no desea importarlo y solo desea imprimir resultados de depuración durante el desarrollo, puede aproximar su resultado.

Algunas de las otras respuestas funcionan bien para las cadenas, pero si las prueba con un objeto de clase le dará el error TypeError: sequence item 0: expected string, instance found.

Para los objetos más complejos, asegúrese de que la clase tiene un método __repr__ que imprime la información de propiedad que desea:

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

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

Y luego, cuando se desea imprimir la salida, sólo tiene que trazar su lista para la función str de esta manera:

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

salidas:

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

También puede hacer cosas como reemplazar el método de list__repr__ para obtener una forma de anidado impresión bastante:

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 

da

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

Desafortunadamente sin sangría de segundo nivel, pero para una depuración rápida que puede ser útil.

Cuestiones relacionadas