Python'da bir liste "güzelce" nasıl yazdırılır


92

PHP'de şunu yapabilirim:

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

Python'da şu anda sadece şunu yapıyorum:

print the_list

Ancak, bu büyük bir veri yığınına neden olacaktır. Okunabilir bir ağaca güzelce basmanın bir yolu var mı? (girintili)?

Yanıtlar:


173
from pprint import pprint
pprint(the_list)

Bir dosyaya nasıl yazdırabiliriz?
Mawg, Monica

5
Neden sadece kullanmıyorsun import pprint?
clankill3r

19
@ clankill3r, o zaman kullanmanız gerekir, pprint.pprint(the_list)genellikle bu sadece kişisel bir tercih meselesidir. Bu durumda içe aktarma satırında fazladan dağınıklığı seçtim.
John La Rooy

2
@Mawg, kullanarak bir çıktı akışı belirtebilirsiniz stream=, varsayılan stdout'tur . docs.python.org/3/library/pprint.html
John La Rooy

Ipython REPL'de varsayılan olarak etkindir
azzamsa

32

İçe aktarmak zorunda kalmadan çalışan hata ayıklama sırasında hızlı bir saldırı pprint, listeye katılmak olacaktır '\n'.

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

Liste içerdiğinde TypeError None.
Noumenon

Kolay çözüm ve "list: * {}" gibi biçimlendirilebilir. Format ('\ n *' .join (lst))
dannydedog

listeniz dizelerden başka bir şey içeriyorsa yapmanız gerekenprint '\n'.join(map(str, lst))
ruh

25

Basitçe, yazdırma işlevi bağımsız değişkenindeki listeyi "paketten çıkararak" ve ayırıcı olarak bir satırsonu (\ n) kullanarak.

baskı (* lst, sep = '\ n')

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

foo
bar
spam
egg

2
Güzel ama maalesef sadece Python 3'te mevcut
Anthony Labarre

1
Python 2.7'de gerçekten ihtiyacınız varsa, yine de gelecekte yazdırma işlevini içe aktarabilirsiniz from __future__ import print_function Yorum için teşekkürler.
MarcoP

21

Şunun gibi bir şey mi diyorsun

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

...? Üstün tanımınıza göre, standart kitaplık modülü pprint akla ilk gelen şeydir; ancak, örnek girdileri ve çıktıları tanımlayabilirseniz (böylece size yardımcı olmak için PHP öğrenmeye gerek kalmaz ;-), daha spesifik yardım sunmamız mümkün olabilir!


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

Çıktı:

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

Bu harika. Ben sadece bunu arıyordum
Lucifer

2

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

Metne ihtiyacınız varsa (örneğin curses ile kullanmak için):

import pprint

myObject = []

myText = pprint.pformat(myObject)

O zaman myTextdeğişken, php var_dumpveya print_r. Daha fazla seçenek ve argüman için belgelere bakın.


2

Diğer yanıtların önerdiği gibi, pprint modülü hile yapıyor.
Bununla birlikte, tüm listeyi bir günlük dosyasına koymanız gereken hata ayıklama durumunda, pprint ile birlikte modül günlüğü ile birlikte pformat yöntemini kullanmak gerekebilir.

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

Ve bunu doğrudan bir Dosyaya kaydetmeniz gerekiyorsa, stream anahtar sözcüğünü kullanarak bir çıktı akışı belirtmeniz gerekir. Referans

from pprint import pprint

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

Stefano Sanfilippo'nun cevabına bakın


2

İçin Python 3 , ben bir şey aynı tür şeyleri shxfee cevabı :

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

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

hangi çıktılar

foo
bar
baz

Bir kenara, bir panda DataFrame'deki sütunları hızlı bir şekilde görmek için benzer bir yardımcı işlev kullanıyorum

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

0

Diğer cevapların da bahsettiği gibi, pprintistediğinizi yapacak harika bir modül. Ancak, içeri aktarmak istemiyorsanız ve geliştirme sırasında yalnızca hata ayıklama çıktısını yazdırmak istiyorsanız, çıktısını yaklaşık olarak tahmin edebilirsiniz.

Diğer yanıtlardan bazıları dizeler için iyi çalışıyor, ancak bunları bir sınıf nesnesiyle denerseniz, size hata verecektir TypeError: sequence item 0: expected string, instance found.

Daha karmaşık nesneler için, sınıfın __repr__istediğiniz özellik bilgilerini yazdıran bir yöntemi olduğundan emin olun :

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

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

Ardından çıktıyı yazdırmak istediğinizde, listenizi aşağıdaki strgibi işlevle eşleştirmeniz yeterlidir :

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

çıktılar:

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

Ayrıca , iç içe geçmiş hoş bir yazdırma biçimi elde etme __repr__yöntemini geçersiz kılmak gibi şeyler de yapabilirsiniz 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

verir

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

Maalesef, ikinci düzey girinti yok, ancak hızlı bir hata ayıklama için faydalı olabilir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.