Довольно печать списка в табличном формате

1

Используя Python 2.4, как мне распечатать список в хорошем табличном формате?

Мой список находится в следующем формате.

mylist=[(('VAL1', 'VAL2', 'VAL3', 'VAL4', 'VAL5', 'VAL6'), AGGREGATE_VALUE)]

Я пробовал pprint, но он не печатает результат в табличном формате.

EDIT: Я хотел бы видеть результат в следующем формате:


VAL1                     VAL3                 VAL5       VAL6         AGGREGATE_VALUE


В этой таблице должны учитываться переменные длины элементов и по-прежнему печатать с соответствующим отступом.

  • 1
    Это немного неясно. Не могли бы вы вставить строку вывода?
  • 0
    Хотите увидеть таблицу в своей консоли? или вы собираетесь выводить на какую-то другую цель, скажем, html?
Показать ещё 2 комментария
Теги:
string
list
printing
tuples

5 ответов

8
Лучший ответ
mylist = [ ( ('12', '47', '4', '574862', '58', '7856'), 'AGGREGATE_VALUE1'),
           ( ('2', '75', '757', '8233', '838', '47775272785'), 'AGGREG2'),
           ( ('4144', '78', '78965', '778', '78578', '2'), 'AGGREGATE_VALUE3')]

longg = dict.fromkeys((0,1,2,3,4,5,6),0)

for tu,x in mylist:
    for i,el in enumerate(tu):
        longg[i] = max(longg[i],len(str(el)))
    longg[6] = max(longg[6],len(str(x)))

fofo = '  '.join('%'+str(longg[i])+'s' for i in xrange(0,7))
print '\n'.join(fofo % (a,b,c,d,e,f,g) for (a,b,c,d,e,f),g in mylist)

результат

  12  47      4  574862     58         7856  AGGREGATE_VALUE1
   2  75    757    8233    838  47775272785           AGGREG2
4144  78  78965     778  78578            2  AGGREGATE_VALUE3

Не знаю, удовлетворяет ли это ваши потребности

РЕДАКТИРОВАТЬ 1

Используя форматирование строки с модульным оператором (%) для печати в постоянной длине, "% 6s" right- оправдывает постоянную длину 6 и '% -6s ' left- оправдывает постоянную длину 6.

Здесь вы найдете предикаты

Но нет смысла указывать постоянную длину, чтобы напечатать что-то в конце строки, потому что в этом случае оправдано несколько naturally- left-. Тогда:

longg = dict.fromkeys((0,1,2,3,4,5,),0)

for tu,x in mylist:
    for i,el in enumerate(tu):
        longg[i] = max(longg[i],len(str(el)))

fofo = '  '.join('%'+str(longg[i])+'s' for i in xrange(0,6)) + '  %s'
print '\n'.join(fofo % (a,b,c,d,e,f,g) for (a,b,c,d,e,f),g in mylist)

EDIT 2

mylist = [ ( (12, 47, 4, 574862, 58, 7856), 'AGGREGATE_VALUE1'),
           ( (2, 75, 757, 8233, 838, 47775272785), 'AGGREG2'),
           ( (4144, 78, 78965, 778, 78578, 2), 'AGGREGATE_VALUE3')]

longg = dict.fromkeys((0,1,2,3,4,5),0)

for tu,_ in mylist:
    longg.update(( i, max(longg[i],len(str(el))) ) for i,el in enumerate(tu))

fofo = '  '.join('%%%ss' % longg[i] for i in xrange(0,6)) + '  %s'
print '\n'.join(fofo % (a,b,c,d,e,f,g) for (a,b,c,d,e,f),g in mylist)

РЕДАКТИРОВАТЬ 3

mylist = [ ( (12, 47, 4, 574862, 58, 7856), 'AGGREGATE_VALUE1'),
           ( (2, 75, 757, 8233, 838, 47775272785), 'AGGREG2'),
           ( (4144, 78, 78965, 778, 78578, 2), 'AGGREGATE_VALUE3')]

header = ('Price1','Price2','reference','XYD','code','resp','AGGREG values')

longg = dict(zip((0,1,2,3,4,5,6),(len(str(x)) for x in header)))

for tu,x in mylist:
    longg.update(( i, max(longg[i],len(str(el))) ) for i,el in enumerate(tu))
    longg[6] = max(longg[6],len(str(x)))
fofo = ' | '.join('%%-%ss' % longg[i] for i in xrange(0,7))

print '\n'.join((fofo % header,
                 '-|-'.join( longg[i]*'-' for i in xrange(7)),
                 '\n'.join(fofo % (a,b,c,d,e,f,g) for (a,b,c,d,e,f),g in mylist)))

результат

Price1 | Price2 | reference | XYD    | code  | resp        | AGGREG values   
-------|--------|-----------|--------|-------|-------------|-----------------
12     | 47     | 4         | 574862 | 58    | 7856        | AGGREGATE_VALUE1
2      | 75     | 757       | 8233   | 838   | 47775272785 | AGGREG2         
4144   | 78     | 78965     | 778    | 78578 | 2           | AGGREGATE_VALUE3

Обратите внимание, что этот вид форматирования будет намного проще с помощью метода string format(), представленного в Python 2.6

  • 0
    Это именно то, что я искал! Но как мне выровнять весь текст по левому краю?
  • 0
    Я только что попробовал Edit 1, и он выводит тот же вывод с выравниванием по правому краю! Кроме того, как мне напечатать строку заголовка?
Показать ещё 6 комментариев
5

Попробуйте текстовый модуль.

Документы: http://foutaise.org/code/texttable/

PyPi: https://pypi.python.org/pypi?name=texttable&:action=display

1

Возможно, что-то вроде этого:

def tabprint(inp):
    for list_el in mylist:
        st = ''
        for word in list_el[0]:
            st += word + '\t' 
        st += str(list_el[1])

    print st
  • 4
    '\t'.join() лучше использовать, чем ручное построение строк.
0

Для произвольного подсчета элементов и произвольного количества строк вы можете использовать:

print "\n".join (map (lambda (x, y): "%s\t%s" % ("\t".join (x), y), mylist) )

Например, для ввода

mylist = [ ( ('VAL11', 'VAL12', 'VAL13', 'VAL14', 'VAL15', 'VAL16'), 'AGGREGATE_VALUE1'),
     ( ('VAL21', 'VAL22', 'VAL23', 'VAL24', 'VAL25', 'VAL26'), 'AGGREGATE_VALUE2'),
     ( ('VAL31', 'VAL32', 'VAL33', 'VAL34', 'VAL35', 'VAL36'), 'AGGREGATE_VALUE3'),]

он дает:

VAL11   VAL12   VAL13   VAL14   VAL15   VAL16   AGGREGATE_VALUE1
VAL21   VAL22   VAL23   VAL24   VAL25   VAL26   AGGREGATE_VALUE2
VAL31   VAL32   VAL33   VAL34   VAL35   VAL36   AGGREGATE_VALUE3
  • 0
    Это работает, но не учитывает переменную длину строки.
0

Из вашего образца вывода это выглядит как "табличный", вы можете иметь в виду вкладку.

Если это правильно, это похоже на работу:

mylist=[(('VAL1', 'VAL2', 'VAL3', 'VAL4', 'VAL5', 'VAL6'), 'AGGREGATE_VALUE')]

def flatten(arg):
    if not hasattr(arg, '__iter__'):
        yield arg
    else:
        for i in arg:
            for j in flatten(i):
                yield j

print '\t'.join(flatten(mylist))

Какие выходы:

VAL1     VAL2     val3     VAL4     VAL5     VAL6     AGGREGATE_VALUE

Ещё вопросы

Сообщество Overcoder
Наверх
Меню