Используя Python 2.4, как мне распечатать список в хорошем табличном формате?
Мой список находится в следующем формате.
mylist=[(('VAL1', 'VAL2', 'VAL3', 'VAL4', 'VAL5', 'VAL6'), AGGREGATE_VALUE)]
Я пробовал pprint
, но он не печатает результат в табличном формате.
EDIT: Я хотел бы видеть результат в следующем формате:
VAL1 VAL3 VAL5 VAL6 AGGREGATE_VALUE
В этой таблице должны учитываться переменные длины элементов и по-прежнему печатать с соответствующим отступом.
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
Не знаю, удовлетворяет ли это ваши потребности
Используя форматирование строки с модульным оператором (%) для печати в постоянной длине, "% 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)
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)
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
Попробуйте текстовый модуль.
Документы: http://foutaise.org/code/texttable/
PyPi: https://pypi.python.org/pypi?name=texttable&:action=display
Возможно, что-то вроде этого:
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
'\t'.join()
лучше использовать, чем ручное построение строк.
Для произвольного подсчета элементов и произвольного количества строк вы можете использовать:
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
Из вашего образца вывода это выглядит как "табличный", вы можете иметь в виду вкладку.
Если это правильно, это похоже на работу:
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