Як «красиво» надрукувати список на Python


89

У PHP я можу зробити це:

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

Наразі в Python я просто роблю це:

print the_list

Однак це призведе до великої кількості даних. Чи є спосіб його красиво надрукувати в зручному для читання дереві? (з відступами)?

Відповіді:


169
from pprint import pprint
pprint(the_list)

Як гарненько надрукувати файл?
Моуг каже, що відновити Моніку

5
Чому б просто не використовувати import pprint?
clankill3r

18
@ clankill3r, тоді вам потрібно використовувати, pprint.pprint(the_list)як правило, це лише питання особистих переваг. У цьому випадку я вирішив мати зайву метушню в рядку імпорту.
John La Rooy,

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

Помилка типу, коли список містить None.
Noumenon

Просте рішення і може бути сформовано як "list: * {}". Format ('\ n *' .join (lst))
dannydedog,

коли ваш список містить щось інше, ніж рядки, які вам слід зробитиprint '\n'.join(map(str, lst))
дух

24

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

друк (* lst, sep = '\ n')

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

foo
bar
spam
egg

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)

Дивіться відповідь Стефано Санфіліппо


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 DataFrame

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

Привіт! Будь ласка, відформатуйте код, оскільки він є, дотримуватися його непросто. Крім того, глобальний не призначений для використання його таким чином у python. Дивіться stackoverflow.com/questions/423379/…
Валентино
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.