2010-07-23 52 views
-1

我有漂亮的打印模塊,我準備,因爲我不高興的pprint模塊生產的數字有一個列表的列表數億列表。這裏是我的模塊的使用示例。如何將漂亮的打印模塊擴展到表格?

>>> a=range(10) 
    >>> a.insert(5,[range(i) for i in range(10)]) 
    >>> a 
    [0, 1, 2, 3, 4, [[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]], 5, 6, 7, 8, 9] 
    >>> import pretty 
    >>> pretty.ppr(a,indent=6) 

    [0, 1, 2, 3, 4, 
      [ 
      [], 
      [0], 
      [0, 1], 
      [0, 1, 2], 
      [0, 1, 2, 3], 
      [0, 1, 2, 3, 4], 
      [0, 1, 2, 3, 4, 5], 
      [0, 1, 2, 3, 4, 5, 6], 
      [0, 1, 2, 3, 4, 5, 6, 7], 
      [0, 1, 2, 3, 4, 5, 6, 7, 8]], 5, 6, 7, 8, 9] 

代碼是這樣的:

""" pretty.py prettyprint module version alpha 0.2 
    mypr: pretty string function 
    ppr: print of the pretty string 
    ONLY list and tuple prettying implemented! 
""" 
def mypr(w, i = 0, indent = 2, nl = '\n') : 
    """ w = datastructure, i = indent level, indent = step size for indention """ 
    startend = {list : '[]', tuple : '()'} 
    if type(w) in (list, tuple) : 
     start, end = startend[type(w)] 
     pr = [mypr(j, i + indent, indent, nl) for j in w] 
     return nl + ' ' * i + start + ', '.join(pr) + end 
    else : return repr(w) 

def ppr(w, i = 0, indent = 2, nl = '\n') : 
    """ see mypr, this is only print of mypr with same parameters """ 
    print mypr(w, i, indent, nl) 

這裏是我的漂亮的打印模塊中的一個固定的文本,表格印刷:

## let's do it "manually" 
width = len(str(10+10)) 
widthformat = '%'+str(width)+'i' 
for i in range(10): 
    for j in range(10): 
     print widthformat % (i+j), 
    print 

你有更好的選擇,對於要推廣這個代碼足夠漂亮的打印模塊?

我張貼的問題後發現,對於這種常規情況下這是什麼模塊:prettytable A simple Python library for easily displaying tabular data in a visually appealing ASCII table format

+1

你的問題有點「爲什麼會做什麼,我就告訴給做?」。答案是,你對它應該爲你做什麼的期望與它所做的不符。 – msw 2010-07-23 15:32:25

+0

我希望發電機應該爲解釋器產生有用的結果。圖標語言給出了很好的答案。圖標語言不符合我對解釋性使用的期望,而這種解釋性使用大部分都是Python填充的。期望和懶惰是發展的源泉:) – 2010-07-23 15:40:32

+0

發電機不能被打印,因爲它們不能被重繞(按照定義)。所以,你的期望是沒有意義的,要高興他們沒有滿足:p你用'0 .. n'表示的意思是Python中的xrange(0,n)',它們有一個非常合理的表示。 – 2010-07-23 15:44:48

回答

7

如果您正在尋找好的格式爲基質,numpy的輸出看起來不錯開箱的:

from numpy import * 
print array([[i + j for i in range(10)] for j in range(10)]) 

輸出:

[[ 0 1 2 3 4 5 6 7 8 9] 
[ 1 2 3 4 5 6 7 8 9 10] 
[ 2 3 4 5 6 7 8 9 10 11] 
[ 3 4 5 6 7 8 9 10 11 12] 
[ 4 5 6 7 8 9 10 11 12 13] 
[ 5 6 7 8 9 10 11 12 13 14] 
[ 6 7 8 9 10 11 12 13 14 15] 
[ 7 8 9 10 11 12 13 14 15 16] 
[ 8 9 10 11 12 13 14 15 16 17] 
[ 9 10 11 12 13 14 15 16 17 18]] 
+0

這個解決方案很好,但它不夠通用,無法放入漂亮的打印模塊。我的第一個要求儘可能自動地做到這一點的良好迴應。從你的代碼的版式不是repr,我希望將其他的行改爲 else:return str(w) – 2010-07-26 19:40:42

3

你可以寫:

'\n'.join( # join the lines with '\n' 
     ' '.join( # join one line with ' ' 
       "%2d" % (i + j) # format each item 
     for i in range(10)) 
    for j in range(10)) 
+0

一點也不差,但是每一個奇怪的日子,我仍然認爲這樣做很醜陋對於字符串的連接,每一天我都認爲它是一個超級Pythonic,並在寫這樣一個Clever Pythonic代碼('\ n')時對自己微笑。加入而不是多次打印)。 – 2010-07-23 16:01:26

1

使用George Sakkis' table indention recipe

print(indent(((i + j for i in range(10)) for j in range(10)), 
      delim=' ', justify='right')) 

收率:

0 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 10 
2 3 4 5 6 7 8 9 10 11 
3 4 5 6 7 8 9 10 11 12 
4 5 6 7 8 9 10 11 12 13 
5 6 7 8 9 10 11 12 13 14 
6 7 8 9 10 11 12 13 14 15 
7 8 9 10 11 12 13 14 15 16 
8 9 10 11 12 13 14 15 16 17 
9 10 11 12 13 14 15 16 17 18 

PS。爲了達到上述目的,我對食譜做了一些小改動。我改變wrapfunc(item)wrapfunc(str(item))

def rowWrapper(row): 
    newRows = [wrapfunc(str(item)).split('\n') for item in row] 
+0

看起來很簡單,直到您查看鏈接配方後面的代碼量。比如我的漂亮功能的9個非註釋行。 – 2010-07-23 20:00:39