Как «красиво» распечатать список на Python

88

В PHP я могу сделать это:

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

В Python я сейчас просто делаю это:

print the_list

Однако это вызовет большой объем данных. Есть ли способ красиво распечатать это в читаемом дереве? (с отступами)?

TIMEX
источник

Ответы:

167
from pprint import pprint
pprint(the_list)
Джон Ла Рой
источник
Как красиво распечатать файл?
Mawg просит восстановить Монику
5
Почему бы просто не использовать import pprint?
clankill3r 08
18
@ clankill3r, то вам нужно использовать, pprint.pprint(the_list)как правило, это просто вопрос личных предпочтений. В этом случае я выбрал лишний беспорядок в строке импорта.
Джон Ла Рой
2
@Mawg, вы можете указать выходной поток, используя stream=, по умолчанию - stdout. docs.python.org/3/library/pprint.html
Джон Ла Рой,
В Ipython REPL он включен по умолчанию
azzamsa
31

Быстрый взлом при отладке, работающий без импорта, - pprintэто присоединение к списку '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg
shxfee
источник
TypeError, когда список содержит None.
Noumenon
Простое решение и может быть отформатировано как `" list: * {} ". Format ('\ n *' .join (lst))
dannydedog
когда в вашем списке есть что-то, кроме строк, вы должны сделатьprint '\n'.join(map(str, lst))
Spirit
24

Просто «распаковав» список в аргументе функции печати и используя новую строку (\ n) в качестве разделителя.

печать (* lst, sep = '\ n')

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

foo
bar
spam
egg
MarcoP
источник
2
Красиво, но, к сожалению, доступно только в Python 3.
Энтони Лабарр
1
Если вам это действительно нужно в Python 2.7, вы все равно можете импортировать функцию печати из будущего from __future__ import print_function Спасибо за комментарий.
MarcoP
21

Вы имеете в виду что-то вроде ...:

>>> 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, чтобы помочь вам ;-), возможно, мы сможем предложить более конкретную помощь!

Алекс Мартелли
источник
5
import json
some_list = ['one', 'two', 'three', 'four']
print(json.dumps(some_list, indent=4))

Выход:

[
    "one",
    "two",
    "three",
    "four"
]
Эяль Левин
источник
2

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

Если вам нужен текст (например, для использования с проклятиями):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Тогда myTextпеременная будет чем-то вроде php var_dumpили print_r. Проверьте документацию на дополнительные варианты, аргументы.

Иакх
источник
2

Как показывают другие ответы, модуль 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))

И если вам нужно напрямую записать его в файл, нужно будет указать выходной поток, используя ключевое слово stream. Ссылка

from pprint import pprint

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

См . Ответ Стефано Санфилиппо

El_Diablo
источник
2

Для Python 3 я делаю то же самое, что и ответ shxfee :

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

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

который выводит

foo
bar
baz

Кроме того, я использую аналогичную вспомогательную функцию для быстрого просмотра столбцов в фрейме данных pandas.

def print_cols(df):
    print('\n'.join(df.columns))
Ааронпен
источник
0

Как уже упоминалось в других ответах, 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

А затем, когда вы хотите распечатать результат, просто сопоставьте свой список с strфункцией следующим образом:

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]

К сожалению, нет отступов на втором уровне, но для быстрой отладки это может быть полезно.

Аарон Д.
источник
0

вы также можете прокрутить свой список:

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

x = ["1",1,"a",8]
fun()
виджей
источник
Здравствуйте! Пожалуйста, отформатируйте код, как есть, уследить непросто. Кроме того, global не предназначен для использования в Python таким образом. См. Stackoverflow.com/questions/423379/…
Валентино