Cómo imprimir una lista en Python "bien"


88

En PHP, puedo hacer esto:

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

En Python, actualmente solo hago esto:

print the_list

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

Respuestas:


167
from pprint import pprint
pprint(the_list)

¿Qué tal una impresión bonita en un archivo?
Mawg dice reinstalar a Monica

5
¿Por qué no usar import pprint?
clankill3r

18
@ clankill3r, entonces necesitas usarlo pprint.pprint(the_list)por lo general es solo una cuestión de preferencia personal. Elegí tener el desorden adicional en la línea de importación en este caso.
John La Rooy

2
@Mawg, puede especificar un flujo de salida usando stream=, el valor predeterminado es stdout. docs.python.org/3/library/pprint.html
John La Rooy

Está habilitado de forma predeterminada en Ipython REPL
azzamsa

31

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

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

TypeError cuando la lista contiene None.
Noumenon

Solución fácil y se puede formatear como `" list: * {} ". Format ('\ n *' .join (lst))
dannydedog

cuando su lista contiene algo diferente a las cadenas que debe hacerprint '\n'.join(map(str, lst))
espíritu

24

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

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

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

foo
bar
spam
egg

2
Agradable pero desafortunadamente solo disponible en Python 3.
Anthony Labarre

1
Si realmente lo necesita en Python 2.7, aún puede importar la función de impresión desde el futuro. from __future__ import print_function Gracias por el comentario.
MarcoP

21

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 le viene a la mente; sin embargo, si puede describir entradas y salidas de ejemplo (para que uno no tenga que aprender PHP para poder ayudarlo ;-), es posible que podamos ofrecer ayuda más específica.


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

Salida:

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

2

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

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

import pprint

myObject = []

myText = pprint.pformat(myObject)

Entonces la myTextvariable será algo similar a php var_dumpo print_r. Consulte la documentación para más opciones, argumentos.


2

Como sugieren las otras respuestas, el módulo pprint hace el truco.
No obstante, en caso de depuración donde es posible que deba poner la lista completa en algún archivo de registro, es posible que deba usar el método pformat junto con el registro del módulo 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 necesita registrarlo directamente en un archivo, tendría que especificar un flujo de salida, utilizando la palabra clave de flujo. Árbitro

from pprint import pprint

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

Vea la respuesta de Stefano Sanfilippo


2

Para Python 3 , hago el mismo tipo de cosas que la respuesta de shxfee :

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

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

que salidas

foo
bar
baz

Como acotación al margen, uso una función auxiliar similar para ver rápidamente columnas en un DataFrame de pandas

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

0

Como han mencionado otras respuestas, pprintes un gran módulo que hará lo que quieras. Sin embargo, si no desea importarlo y solo desea imprimir la salida de depuración durante el desarrollo, puede aproximar su salida.

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

Para objetos más complejos, asegúrese de que la clase tenga un __repr__método que imprima 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 desee imprimir la salida, simplemente asigne su lista a la strfunción 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 anular el __repr__método de listpara obtener una forma de impresión bonita anidada:

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, no hay sangría de segundo nivel, pero para una depuración rápida puede ser útil.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.