Comment imprimer une liste en Python «bien»

88

En PHP, je peux faire ceci:

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

En Python, je fais actuellement ceci:

print the_list

Cependant, cela entraînera un gros jumbo de données. Existe-t-il un moyen de l'imprimer correctement dans un arbre lisible? (avec des retraits)?

TIMEX
la source

Réponses:

167
from pprint import pprint
pprint(the_list)
John La Rooy
la source
Comment ne pas imprimer dans un fichier?
Mawg dit de réintégrer Monica le
5
Pourquoi ne pas simplement utiliser import pprint?
clankill3r
18
@ clankill3r, alors vous devez utiliser pprint.pprint(the_list)généralement c'est juste une question de préférence personnelle. J'ai choisi d'avoir le fouillis supplémentaire dans la ligne d'importation dans ce cas.
John La Rooy
2
@Mawg, vous pouvez spécifier un flux de sortie en utilisant stream=, la valeur par défaut est stdout. docs.python.org/3/library/pprint.html
John La Rooy
Il est activé par défaut dans Ipython REPL
azzamsa
31

Un hack rapide lors du débogage qui fonctionne sans avoir à importer pprintserait de rejoindre la liste '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg
shxfee
la source
TypeError lorsque la liste contient None.
Noumenon
Solution facile et peut être formaté comme `" list: * {} ". Format ('\ n *' .join (lst))
dannydedog
lorsque votre liste contient autre chose que des chaînes que vous devriez faireprint '\n'.join(map(str, lst))
esprit
24

Simplement en "décompressant" la liste dans l'argument de la fonction d'impression et en utilisant une nouvelle ligne (\ n) comme séparateur.

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

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

foo
bar
spam
egg
MarcoP
la source
2
Bien mais malheureusement uniquement disponible en Python 3.
Anthony Labarre
1
Si vous en avez vraiment besoin dans Python 2.7, vous pouvez toujours importer la fonction d'impression à partir du futur from __future__ import print_function Merci pour le commentaire.
MarcoP
21

Vous voulez dire quelque chose comme ...:

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

...? D'après votre description superficielle, le module de bibliothèque standard pprint est la première chose qui vous vient à l'esprit; cependant, si vous pouvez décrire des exemples d'entrées et de sorties (pour ne pas avoir à apprendre PHP pour vous aider ;-), il nous sera peut-être possible de vous proposer une aide plus spécifique!

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

Production:

[
    "one",
    "two",
    "three",
    "four"
]
Eyal Levin
la source
2

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

Si vous avez besoin du texte (pour une utilisation avec des malédictions par exemple):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Ensuite, la myTextvariable sera quelque chose de semblable à php var_dumpou print_r. Consultez la documentation pour plus d'options, d'arguments.

Iacchus
la source
2

Comme les autres réponses le suggèrent, le module pprint fait l'affaire.
Néanmoins, en cas de débogage où vous pourriez avoir besoin de mettre la liste entière dans un fichier journal, vous devrez peut-être utiliser la méthode pformat avec la journalisation du module avec 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))

Et si vous avez besoin de le connecter directement à un fichier, il faudrait spécifier un flux de sortie, en utilisant le mot-clé stream. Réf

from pprint import pprint

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

Voir la réponse de Stefano Sanfilippo

El_Diablo
la source
2

Pour Python 3 , je fais le même genre de chose que la réponse de shxfee :

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

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

quelles sorties

foo
bar
baz

En passant, j'utilise une fonction d'assistance similaire pour voir rapidement les colonnes dans un pandas DataFrame

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

Comme d'autres réponses l'ont mentionné, pprintc'est un excellent module qui fera ce que vous voulez. Cependant, si vous ne voulez pas l'importer et que vous voulez simplement imprimer la sortie de débogage pendant le développement, vous pouvez approximer sa sortie.

Certaines des autres réponses fonctionnent bien pour les chaînes, mais si vous les essayez avec un objet de classe, cela vous donnera l'erreur TypeError: sequence item 0: expected string, instance found.

Pour les objets plus complexes, assurez-vous que la classe dispose d'une __repr__méthode qui imprime les informations de propriété souhaitées:

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

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

Et puis, lorsque vous souhaitez imprimer la sortie, mappez simplement votre liste à la strfonction comme ceci:

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

les sorties:

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

Vous pouvez également faire des choses comme remplacer la __repr__méthode de listpour obtenir une forme d'impression jolie imbriquée:

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

donne

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

Malheureusement pas d'indentation de deuxième niveau mais pour un débogage rapide cela peut être utile.

Aaron D
la source
0

vous pouvez également parcourir votre liste en boucle:

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

x = ["1",1,"a",8]
fun()
vijay
la source
salut! Veuillez formater le code, tel quel, ce n'est pas facile à suivre. De plus, global n'est pas destiné à être utilisé de cette façon en python. Voir stackoverflow.com/questions/423379/…
Valentino