Jak „ładnie” wydrukować listę w Pythonie

88

W PHP mogę to zrobić:

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

W Pythonie obecnie robię to:

print the_list

Spowoduje to jednak duży zbiór danych. Czy jest jakiś sposób, aby ładnie wydrukować to w czytelnym drzewie? (z wcięciami)?

TIMEX
źródło

Odpowiedzi:

167
from pprint import pprint
pprint(the_list)
John La Rooy
źródło
Jak ładnie wydrukować do pliku?
Mawg mówi, żeby przywrócić Monice
5
Dlaczego po prostu nie użyć import pprint?
clankill3r
18
@ clankill3r, musisz go użyć, pprint.pprint(the_list)zwykle jest to kwestia osobistych preferencji. W tym przypadku zdecydowałem się na dodatkowy bałagan w wierszu importu.
John La Rooy,
2
@Mawg, możesz określić strumień wyjściowy za pomocą stream=, domyślnie jest to stdout. docs.python.org/3/library/pprint.html
John La Rooy
Jest domyślnie włączony w Ipython REPL
azzamsa
31

Szybkim hackem podczas debugowania, który działa bez konieczności importowania, pprintbyłoby dołączenie do listy '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg
shxfee
źródło
TypeError, gdy lista zawiera None.
Noumenon,
Łatwe rozwiązanie i może być sformatowane jak `" list: * {} ". Format ('\ n *' .join (lst))
dannydedog
kiedy twoja lista zawiera coś innego niż stringi, powinieneś zrobićprint '\n'.join(map(str, lst))
duch
24

Wystarczy „rozpakować” listę w argumencie funkcji drukowania i użyć znaku nowej linii (\ n) jako separatora.

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

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

foo
bar
spam
egg
MarcoP
źródło
2
Ładne, ale niestety dostępne tylko w Pythonie 3.
Anthony Labarre,
1
Jeśli naprawdę potrzebujesz tego w Pythonie 2.7, nadal możesz zaimportować funkcję drukowania z przyszłości. from __future__ import print_function Dziękujemy za komentarz.
MarcoP
21

Masz na myśli coś takiego ...:

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

...? Z twojego pobieżnego opisu, pierwszą rzeczą, która przychodzi na myśl, jest moduł biblioteki standardowej pprint ; jeśli jednak potrafisz opisać przykładowe wejścia i wyjścia (żeby nie trzeba było uczyć się PHP, aby ci pomóc ;-), być może będziemy mogli zaoferować bardziej szczegółową pomoc!

Alex Martelli
źródło
5
import json
some_list = ['one', 'two', 'three', 'four']
print(json.dumps(some_list, indent=4))

Wynik:

[
    "one",
    "two",
    "three",
    "four"
]
Eyal Levin
źródło
2

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

Jeśli potrzebujesz tekstu (na przykład do używania z przekleństwami):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Wtedy myTextzmienna będzie podobna do php var_dumplub print_r. Sprawdź dokumentację, aby uzyskać więcej opcji i argumentów.

Iacchus
źródło
2

Jak sugerują inne odpowiedzi, moduł pprint załatwia sprawę .
Niemniej jednak, w przypadku debugowania, w którym może być konieczne umieszczenie całej listy w jakimś pliku dziennika, może być konieczne użycie metody pformat wraz z rejestrowaniem modułu wraz z pprintem.

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

A jeśli chcesz zarejestrować go bezpośrednio w pliku, należałoby określić strumień wyjściowy za pomocą słowa kluczowego stream. Nr ref

from pprint import pprint

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

Zobacz odpowiedź Stefano Sanfilippo

El_Diablo
źródło
2

W przypadku Pythona 3 robię to samo, co odpowiedź shxfee :

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

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

które wyjścia

foo
bar
baz

Na marginesie, używam podobnej funkcji pomocniczej, aby szybko zobaczyć kolumny w pandach DataFrame

def print_cols(df):
    print('\n'.join(df.columns))
aaronpenne
źródło
0

Jak wspomniały inne odpowiedzi, pprintjest to świetny moduł, który zrobi, co chcesz. Jeśli jednak nie chcesz go importować i po prostu chcesz wydrukować wynik debugowania podczas programowania, możesz przybliżyć jego wynik.

Niektóre inne odpowiedzi działają dobrze w przypadku łańcuchów, ale jeśli wypróbujesz je z obiektem klasy, otrzymasz błąd TypeError: sequence item 0: expected string, instance found.

W przypadku bardziej złożonych obiektów upewnij się, że klasa ma __repr__metodę, która drukuje żądane informacje o właściwościach:

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

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

A jeśli chcesz wydrukować wynik, po prostu zamapuj swoją listę na strfunkcję taką:

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

wyjścia:

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

Możesz także zrobić takie rzeczy, jak nadpisanie __repr__metody, listaby uzyskać formę zagnieżdżonego ładnego drukowania:

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

daje

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

Niestety nie ma wcięć drugiego poziomu, ale może być przydatne do szybkiego debugowania.

Aaron D.
źródło
0

możesz również zapętlić swoją listę:

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

x = ["1",1,"a",8]
fun()
vijay
źródło
Cześć! Sformatuj kod, ponieważ jest to trudne do naśladowania. Ponadto global nie ma być używany w ten sposób w Pythonie. Zobacz stackoverflow.com/questions/423379/…
Valentino