Cách in một danh sách bằng Python “độc đáo”


88

Trong PHP, tôi có thể làm điều này:

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

Trong Python, tôi hiện chỉ làm điều này:

print the_list

Tuy nhiên, điều này sẽ gây ra một lượng lớn dữ liệu. Có cách nào để in nó độc đáo thành một cây có thể đọc được không? (có thụt lề)?

Câu trả lời:


167
from pprint import pprint
pprint(the_list)

Làm thế nào để in một tập tin đẹp?
Mawg nói hãy phục hồi Monica vào

5
Tại sao không chỉ sử dụng import pprint?
clankill3r

18
@ clankill3r, sau đó bạn cần sử dụng pprint.pprint(the_list)thường chỉ là vấn đề sở thích cá nhân. Tôi đã chọn có thêm sự lộn xộn trong dòng nhập khẩu trong trường hợp này.
John La Rooy

2
@Mawg, bạn có thể chỉ định luồng đầu ra bằng cách sử dụng stream=, mặc định là stdout. docs.python.org/3/library/pprint.html
John La Rooy

Nó được bật theo mặc định trong Ipython REPL
azzamsa 23/02/19

31

Một cách nhanh chóng trong khi gỡ lỗi hoạt động mà không cần phải nhập pprintsẽ là tham gia vào danh sách trên '\n'.

>>> lst = ['foo', 'bar', 'spam', 'egg']
>>> print '\n'.join(lst)
foo
bar
spam
egg

TypeError khi danh sách chứa None.
Noumenon

Giải pháp dễ dàng và có thể được formated như ` "danh sách: * {}" định dạng ( '\ n *' .join (lst)).
dannydedog

khi danh sách của bạn chứa một cái gì đó khác thì bạn nên làm như vậyprint '\n'.join(map(str, lst))
linh

24

Chỉ cần "giải nén" danh sách trong đối số hàm in và sử dụng một dòng mới (\ n) làm dấu phân tách.

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

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

foo
bar
spam
egg

2
Đẹp nhưng tiếc là chỉ có sẵn trong Python 3.
Anthony Labarre

1
Nếu bạn thực sự cần nó trong Python 2.7, bạn vẫn có thể nhập hàm in từ tương lai from __future__ import print_function Cảm ơn bạn đã nhận xét.
MarcoP

21

Ý của bạn là ...:

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

...? Từ mô tả lướt qua của bạn, tiêu chuẩn mô-đun thư viện pprint là điều đầu tiên mà nói đến cái tâm; tuy nhiên, nếu bạn có thể mô tả các đầu vào và đầu ra ví dụ (để một người không phải học PHP để giúp bạn ;-), chúng tôi có thể cung cấp trợ giúp cụ thể hơn!


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

Đầu ra:

[
    "one",
    "two",
    "three",
    "four"
]

2

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

Nếu bạn cần văn bản (để sử dụng với lời nguyền chẳng hạn):

import pprint

myObject = []

myText = pprint.pformat(myObject)

Sau đó, myTextbiến sẽ giống như php var_dumphoặc print_r. Kiểm tra tài liệu để biết thêm tùy chọn, đối số.


2

Như các câu trả lời khác cho thấy mô-đun pprint thực hiện thủ thuật.
Tuy nhiên, trong trường hợp gỡ lỗi mà bạn có thể cần đặt toàn bộ danh sách vào một số tệp nhật ký, người ta có thể phải sử dụng phương thức pformat cùng với ghi nhật ký mô-đun cùng với 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))

Và nếu bạn cần trực tiếp đăng nhập nó vào một Tệp, người ta sẽ phải chỉ định một luồng đầu ra, sử dụng từ khóa luồng. Tham khảo

from pprint import pprint

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

Xem câu trả lời của Stefano Sanfilippo


2

Đối với Python 3 , tôi làm điều tương tự như câu trả lời của shxfee :

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

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

đầu ra nào

foo
bar
baz

Ngoài ra, tôi sử dụng một hàm trợ giúp tương tự để xem nhanh các cột trong DataFrame của gấu trúc

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

0

Như các câu trả lời khác đã đề cập, pprintlà một mô-đun tuyệt vời sẽ làm những gì bạn muốn. Tuy nhiên, nếu bạn không muốn nhập nó và chỉ muốn in đầu ra gỡ lỗi trong quá trình phát triển, bạn có thể ước tính đầu ra của nó.

Một số câu trả lời khác hoạt động tốt cho các chuỗi, nhưng nếu bạn thử chúng với một đối tượng lớp, nó sẽ cho bạn lỗi TypeError: sequence item 0: expected string, instance found .

Đối với các đối tượng phức tạp hơn, hãy đảm bảo rằng lớp có __repr__phương thức in thông tin thuộc tính bạn muốn:

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

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

Và sau đó khi bạn muốn in đầu ra, chỉ cần ánh xạ danh sách của bạn với strhàm như sau:

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

kết quả đầu ra:

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

Bạn cũng có thể làm những việc như ghi đè __repr__phương thức của listđể có được một biểu mẫu in đẹp lồng nhau:

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

cho

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

Rất tiếc là không có thụt lề cấp hai nhưng để gỡ lỗi nhanh, nó có thể hữu ích.


0

bạn cũng có thể lặp lại danh sách của mình:

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

x = ["1",1,"a",8]
fun()

Xin chào! Vui lòng định dạng mã, vì nó là như vậy, không dễ làm theo. Ngoài ra, toàn cầu không được sử dụng theo cách đó trong python. Xem stackoverflow.com/questions/423379/…
Valentino ngày
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.