Как распечатать список в Python "красиво"
в PHP, я могу сделать это:
echo '<pre>'
print_r($array);
echo '</pre>'
в Python, я в настоящее время просто делаю это:
print the_list
однако это вызовет большой объем данных. Есть ли способ красиво напечатать его в читаемом дереве? (с отступами)?
8 ответов:
Вы имеете в виду что-то вроде...:
>>> 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'] >>>
...? Из вашего беглого описания, стандартный библиотечный модуль pprint это первое, что приходит на ум; однако, если вы можете описать примеры входов и выходов (так что вам не нужно изучать PHP, чтобы помочь вам; -), мы можем предложить более конкретную помощь!
быстрый Хак во время отладки, который работает без необходимости импортировать
pprint
было бы присоединиться к списку на'\n'
.>>> lst = ['foo', 'bar', 'spam', 'egg'] >>> print '\n'.join(lst) foo bar spam egg
просто "распаковав" список в аргументе функции печати и используя новую строку (\n) в качестве разделителя.
print (*lst, sep='\n')
lst = ['foo', 'bar', 'spam', 'egg'] print(*lst, sep='\n') foo bar spam egg
https://docs.python.org/3/library/pprint.html
Если вам нужен текст (например, для использования с проклятиями):
import pprint myObject = [] myText = pprint.pformat(myObject)
затем
myText
переменная будет что-то вроде phpvar_dump
илиprint_r
. Проверьте документацию для получения дополнительных параметров, аргументов.
Как показывают другие ответы pprint модуль делает трюк.
Тем не менее, в случае отладки, где вам может потребоваться поместить весь список в какой-либо файл журнала, возможно, придется использовать метод pformat вместе с модулем лесозаготовки вместе с 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))
и если вам нужно войти в файл, нужно указать выходной поток, используя ключевое слово поток. Ref
from pprint import pprint with open('output.txt', 'wt') as out: pprint(myTree, stream=out)
посмотреть ответ Стефано Санфилиппо
как уже упоминалось в других ответах,
pprint
большой модуль, который будет делать то, что вы хотите. Однако если вы не хотите импортировать его и просто хотите распечатать отладочный вывод во время разработки, вы можете приблизить его вывод.некоторые из других ответов отлично работает для строк, но если вы попробуете их с объектом класса это даст вам ошибку
TypeError: sequence item 0: expected string, instance found
.для более сложных объектов, убедитесь, что класс
__repr__
метод, который печатает собственность информация, которую вы хотите:class Foo(object): def __init__(self, bar): self.bar = bar def __repr__(self): return "Foo - (%r)" % self.bar
а затем, когда вы хотите распечатать вывод, просто сопоставьте свой список с такой:
l = [Foo(10), Foo(20), Foo("A string"), Foo(2.4)] print "[%s]" % ",\n ".join(map(str,l))
выходы:
[Foo - (10), Foo - (20), Foo - ('A string'), Foo - (2.4)]
вы также можете делать вещи, как переопределить
__repr__
методlist
чтобы получить форму вложенной довольно печати: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]
к сожалению, нет отступа второго уровня, но для быстрой отладки это может быть полезно.
на Python 3, я делаю то же самое, как ответ shxfee:
def print_list(my_list): print('\n'.join(my_list)) a = ['foo', 'bar', 'baz'] print_list(a)
выходы
foo bar baz
в стороне, я использую аналогичную вспомогательную функцию, чтобы быстро увидеть столбцы в панд DataFrame
def print_cols(df): print('\n'.join(df.columns))