Как расширить симпатичный модуль печати для таблиц? - PullRequest
0 голосов
/ 23 июля 2010

У меня есть симпатичный модуль печати, который я подготовил, потому что я не был доволен, что модуль 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 Простая библиотека Python для простого отображения табличных данных в визуально привлекательном формате таблицы ASCII

Ответы [ 4 ]

7 голосов
/ 23 июля 2010

Если вы ищете хорошее форматирование для матриц, вывод 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]]
3 голосов
/ 23 июля 2010

Вы можете написать:

'\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))
1 голос
/ 28 июля 2010
1 голос
/ 23 июля 2010

Использование Рецепт отступа таблицы Джорджа Саккиса :

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...