2010-07-23 2 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

+0

У меня есть ожидания, что генераторы должны давать полезные результаты для интерпретатора. Язык значков дает хорошие ответы 0..n. Язык значков не оправдывает мое ожидание использования интерпретации, которое Python в основном заполняет. Ожидания и лень являются источниками развития :) –

+0

Генераторы не могут быть напечатаны, потому что их нельзя перематывать (по определению). Итак, ваши ожидания не имеют смысла, радуйтесь, что они не заполнены: p Что вы подразумеваете под '0 .. n' является' xrange (0, n) 'в Python, и они имеют очень разумное представление. –

ответ

7

Если вы ищете хорошее форматирование для матриц, выход numpy «s отлично смотрится прямо из коробки:

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

Это решение неплохое, но его недостаточно для размещения в довольно печатном модуле. Хороший ответ для моего первого запроса сделать это как можно более автоматически. Из макета вашего кода, который не является реестром, я решил изменить остальные строки на else: return str (w) –

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

Не так уж плохо, но каждый нечетный день я все еще считаю уродливым, чтобы делать подобные трюки для конкатенирования строк каждый день я считаю супер-питоновским и улыбаюсь себе при написании такого умного питонического кода ('\ n'.вместо нескольких отпечатков). –

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 строк без комментариев моих симпатичных функций. –

Смежные вопросы