Como imprimir uma lista em Python “agradavelmente”

88

Em PHP, posso fazer isso:

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

Em Python, atualmente faço apenas isso:

print the_list

No entanto, isso causará uma grande quantidade de dados. Existe alguma maneira de imprimi-lo bem em uma árvore legível? (com recuos)?

TIMEX
fonte

Respostas:

167
from pprint import pprint
pprint(the_list)
John La Rooy
fonte
Como imprimir em um arquivo?
Mawg diz para restabelecer Monica em
5
Por que não apenas usar import pprint?
clankill3r
18
@ clankill3r, então você precisa usar pprint.pprint(the_list)geralmente é apenas uma questão de preferência pessoal. Eu escolhi ter a desordem extra na linha de importação neste caso.
John La Rooy,
2
@Mawg, você pode especificar um fluxo de saída usando stream=, o padrão é stdout. docs.python.org/3/library/pprint.html
John La Rooy
Está habilitado por padrão no Ipython REPL
azzamsa
31

Um hack rápido durante a depuração que funciona sem a necessidade de importar pprintseria entrar na lista '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg
shxfee
fonte
DigiteError quando a lista contiver None.
Noumenon
Solução fácil e pode ser formatado como `" list: * {} ". Format ('\ n *' .join (lst))
dannydedog
quando sua lista contém algo diferente de strings que você deve fazerprint '\n'.join(map(str, lst))
espírito
24

Simplesmente "descompactando" a lista no argumento da função de impressão e usando uma nova linha (\ n) como separador.

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

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

foo
bar
spam
egg
MarcoP
fonte
2
Legal, mas infelizmente disponível apenas em Python 3.
Anthony Labarre
1
Se você realmente precisa dele no Python 2.7, você ainda pode importar a função de impressão do futuro. from __future__ import print_function Obrigado pelo comentário.
MarcoP
21

Você quer dizer 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']
>>> 

...? A partir de sua descrição superficial, pprint de módulo de biblioteca padrão é a primeira coisa que vem à mente; entretanto, se você puder descrever entradas e saídas de exemplo (para que não seja necessário aprender PHP para ajudá-lo ;-), pode ser possível para nós oferecer uma ajuda mais específica!

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

Resultado:

[
    "one",
    "two",
    "three",
    "four"
]
Eyal Levin
fonte
2

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

Se você precisar do texto (para usar com maldições, por exemplo):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Então a myTextvariável será algo parecido com php var_dumpou print_r. Verifique a documentação para mais opções, argumentos.

Iacchus
fonte
2

Como as outras respostas sugerem, o módulo pprint resolve o problema.
No entanto, no caso de depuração onde você pode precisar colocar a lista inteira em algum arquivo de log, pode ser necessário usar o método pformat junto com o log do módulo junto com o 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 você precisar registrá-lo diretamente em um arquivo, será necessário especificar um fluxo de saída, usando a palavra-chave stream. Ref

from pprint import pprint

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

Veja a resposta de Stefano Sanfilippo

El_Diablo
fonte
2

Para Python 3 , faço o mesmo tipo de coisa que a resposta de shxfee :

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

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

quais saídas

foo
bar
baz

Como um aparte, eu uso uma função auxiliar semelhante para ver rapidamente as colunas em um DataFrame pandas

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

Como outras respostas mencionaram, pprinté um ótimo módulo que fará o que você quiser. No entanto, se você não deseja importá-lo e deseja apenas imprimir a saída de depuração durante o desenvolvimento, você pode aproximar sua saída.

Algumas das outras respostas funcionam bem para strings, mas se você tentar com um objeto de classe, receberá o erro TypeError: sequence item 0: expected string, instance found.

Para objetos mais complexos, certifique-se de que a classe tenha um __repr__método que imprima as informações de propriedade que você deseja:

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

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

E então, quando você quiser imprimir a saída, simplesmente mapeie sua lista para a strfunção como esta:

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

saídas:

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

Você também pode fazer coisas como substituir o __repr__método de listpara obter uma forma de impressão bonita aninhada:

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]

Infelizmente, nenhum recuo de segundo nível, mas para uma depuração rápida, pode ser útil.

Aaron D
fonte
0

você também pode percorrer sua lista:

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

x = ["1",1,"a",8]
fun()
vijay
fonte
Olá! Formate o código, pois é, não é fácil de seguir. Além disso, global não deve ser usado dessa forma em python. Consulte stackoverflow.com/questions/423379/…
Valentino