So drucken Sie eine Liste in Python "schön"

84

In PHP kann ich das tun:

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

In Python mache ich derzeit nur Folgendes:

print the_list

Dies führt jedoch zu einem großen Datenvolumen. Gibt es eine Möglichkeit, es schön in einen lesbaren Baum zu drucken? (mit Einrückungen)?

TIMEX
quelle

Antworten:

158
from pprint import pprint
pprint(the_list)
John La Rooy
quelle
Wie schön ist es, in eine Datei zu drucken?
Mawg sagt, Monica am
5
Warum nicht einfach benutzen import pprint?
Clankill3r
16
@ clankill3r, dann musst du pprint.pprint(the_list)normalerweise verwenden, es ist nur eine Frage der persönlichen Präferenz. In diesem Fall habe ich mich für die zusätzliche Unordnung in der Importzeile entschieden.
John La Rooy
2
@Mawg, Sie können einen Ausgabestream mit angeben stream=, der Standardwert ist stdout. docs.python.org/3/library/pprint.html
John La Rooy
Es ist standardmäßig in Ipython REPL
aktiviert
31

Ein schneller Hack beim Debuggen, der ohne Import funktioniert, pprintwäre, sich der Liste anzuschließen '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg
shxfee
quelle
Geben Sie Error ein, wenn die Liste enthält None.
Noumenon
Einfache Lösung und kann wie "list: * {}" formatiert werden. Format ('\ n *' .join (lst))
dannydedog
Wenn Ihre Liste etwas anderes als Zeichenfolgen enthält, sollten Sie dies tunprint '\n'.join(map(str, lst))
Spirit
22

Einfach durch "Entpacken" der Liste im Argument der Druckfunktion und Verwenden eines Zeilenumbruchs (\ n) als Trennzeichen.

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

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

foo
bar
spam
egg
MarcoP
quelle
2
Schön, aber leider nur in Python 3 verfügbar.
Anthony Labarre
1
Wenn Sie es in Python 2.7 wirklich brauchen, können Sie die Druckfunktion trotzdem aus der Zukunft importieren. from __future__ import print_function Vielen Dank für den Kommentar.
MarcoP
21

Du meinst so etwas wie ...:

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

...? Aus Ihrer kursorische Beschreibung Standardbibliotheksmodul pprint ist das erste , was in den Sinn kommt; Wenn Sie jedoch Beispiel-Ein- und Ausgänge beschreiben können (damit Sie nicht PHP lernen müssen, um Ihnen zu helfen ;-), können wir möglicherweise spezifischere Hilfe anbieten!

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

Ausgabe:

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

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

Wenn Sie den Text benötigen (zum Beispiel zur Verwendung mit Flüchen):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Dann wird myTextVariable etwas ähnliches php var_dumpoder print_r. Weitere Optionen und Argumente finden Sie in der Dokumentation.

Iacchus
quelle
1

Wie die anderen Antworten vermuten lassen, macht das pprint- Modul den Trick.
Dennoch bei dem Debuggen , wo Sie benötigen könnten die gesamte Liste in eine Protokolldatei zu setzen, könnte man pFormat Methode zu verwenden , zusammen mit Modul hat Protokollierung zusammen mit 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))

Und wenn Sie es direkt in einer Datei protokollieren müssen, müssen Sie einen Ausgabestream mit dem Schlüsselwort stream angeben. Ref

from pprint import pprint

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

Siehe Stefano Sanfilippos Antwort

El_Diablo
quelle
1

Für Python 3 mache ich dasselbe wie die Antwort von shxfee :

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

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

welche Ausgänge

foo
bar
baz

Nebenbei benutze ich eine ähnliche Hilfsfunktion, um schnell Spalten in einem Pandas DataFrame zu sehen

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

Wie andere Antworten bereits erwähnt haben, pprintist es ein großartiges Modul, das macht, was Sie wollen. Wenn Sie es jedoch nicht importieren und nur die Debugging-Ausgabe während der Entwicklung drucken möchten, können Sie die Ausgabe approximieren.

Einige der anderen Antworten funktionieren gut für Zeichenfolgen, aber wenn Sie sie mit einem Klassenobjekt versuchen, erhalten Sie den Fehler TypeError: sequence item 0: expected string, instance found.

Stellen Sie bei komplexeren Objekten sicher, dass die Klasse über eine __repr__Methode verfügt, mit der die gewünschten Eigenschaftsinformationen gedruckt werden:

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

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

Wenn Sie dann die Ausgabe drucken möchten, ordnen Sie Ihre Liste einfach der folgenden strFunktion zu:

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

Ausgänge:

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

Sie können auch die __repr__Methode überschreiben list, um eine Form des verschachtelten hübschen Druckens zu erhalten:

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

gibt

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

Leider kein Einzug der zweiten Ebene, aber für ein schnelles Debuggen kann es nützlich sein.

Aaron D.
quelle
0

Sie können auch Ihre Liste durchlaufen:

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

x = ["1",1,"a",8]
fun()
Vijay
quelle
Hallo! Bitte formatieren Sie den Code so wie er ist, es ist nicht einfach zu folgen. Außerdem soll global in Python nicht so verwendet werden. Siehe stackoverflow.com/questions/423379/…
Valentino