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)?

TIMEX
fuente

Respuestas:

167
from pprint import pprint
pprint(the_list)
John La Rooy
fuente
¿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
shxfee
fuente
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
MarcoP
fuente
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.

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

Salida:

[
    "one",
    "two",
    "three",
    "four"
]
Eyal Levin
fuente
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.

Iacchus
fuente
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

El_Diablo
fuente
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))
Aaronpenne
fuente
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.

Aaron D
fuente
0

también puede recorrer su lista:

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

x = ["1",1,"a",8]
fun()
vijay
fuente
¡Hola! Formatee el código, tal como está, no es fácil de seguir. Además, global no está destinado a usarse de esa manera en Python. Ver stackoverflow.com/questions/423379/…
Valentino