Pythonでリストを「うまく」印刷する方法


88

PHPでは、次のことができます。

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

Pythonでは、現在これを行っています。

print the_list

ただし、これにより大量のデータが発生します。読みやすいツリーにうまく印刷する方法はありますか?(インデント付き)?

回答:


167
from pprint import pprint
pprint(the_list)

ファイルにどのようにきれいに印刷しますか?
Mawgは、2016

5
なぜ使ってみませんimport pprintか?
clankill3r 2017年

18
@ clankill3rの場合、pprint.pprint(the_list)通常は使用する必要がありますが、これは個人的な好みの問題です。この場合、インポート行に余分な雑然としたものを含めることにしました。
John La Rooy 2017年

2
@Mawg、を使用して出力ストリームを指定できますstream=。デフォルトはstdoutです。docs.python.org/3/library/pprint.html
John La Rooy 2017年

これはIpython REPLにデフォルトで有効になっています
azzamsa

31

インポートせずに機能するデバッグ中の簡単なハックpprintは、のリストに参加すること'\n'です。

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

リストにが含まれてNoneいる場合のTypeError 。
ヌーメノン2018

簡単な解決策で、 `" list:* {} "。format( '\ n *'。join(lst))のようにフォーマットできます
dannydedog 2018年

リストに文字列以外の何かが含まれている場合は、実行する必要がありますprint '\n'.join(map(str, lst))
精神

24

print関数の引数でリストを「解凍」し、区切り文字として改行(\ n)を使用するだけです。

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

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

foo
bar
spam
egg

2
Pythonの3のニース残念ながらのみ利用可能
アンソニーLabarre

1
Python 2.7で本当に必要な場合でも、今後 もprint関数をインポートできます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

テキストが必要な場合(たとえば、cursesで使用する場合):

import pprint

myObject = []

myText = pprint.pformat(myObject)

次に、myText変数はphpvar_dumpまたはprint_r。のようなものになります。その他のオプション、引数については、ドキュメントを確認してください。


2

他の答えが示唆するように、pprintモジュールがトリックを行います。
それでも、リスト全体をログファイルに入れる必要があるデバッグの場合は、pprintとともにモジュールロギングとともにpformatメソッドを使用する必要があります。

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

余談ですが、同様のヘルパー関数を使用して、パンダの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]

残念ながら、第2レベルのインデントはありませんが、迅速なデバッグには役立ちます。


0

リストをループすることもできます。

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

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

こんにちは!コードをそのままフォーマットしてください。簡単に理解することはできません。また、globalはPythonでそのように使用されることを意図していません。参照してくださいstackoverflow.com/questions/423379/...
バレンチノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.