2014-01-02 5 views
0

Я пытаюсь форматировать таблицу выглядеть примерно так:Fancy Строка форматирования

0 Banana 1 Apple   2 Orange 
3 Pear  4 Grape   5 Coconut 
6 Test1  7 Test2   8 Test3 
9 Test4  10 TestTest5 11 TestTest6 

Минимальное количество пробелов между элементами должно быть 4. От 0 до 1 банан Apple, и 10 TestTest5 и 11 TestTest6. Выровнялся влево.

Я пытаюсь с помощью этой строки formatation ...

i = 0 
line = "" 
whole = "" 
for n,m in enumerate(grid): 
    if i <3: 
     line += "%s %-13s" % (n, m) 
    else: 
     whole += "%s\n"%line 
     line = "%s %-13s" % (n, m) 
     i = 0 
    i += 1 
whole += "%s\n" % line 
whole = whole.replace("'", "") 
whole = whole.replace('"', "") 

print whole 

, но результат не совсем то же самое

0 Banana  1 Apple  2 Orange  
3 Pear   4 Grape  5 Coconut  
6 Test1  7 Test2  8 Test3   
9 Test4  10 TestTest5 11 TestTest6 

Как я могу добиться этого? Наверное, мне нужно изменить способ% -13s в зависимости от длины строк выше/ниже.

+1

Что такое «сетка»? – Christian

+0

Почему бы не форматировать числа для использования * двух * позиций? Например. ''0 Banana'' и' '10 TestTest5'', чтобы номера совпадали. –

+0

@Christian: Предположительно последовательность строк. Разве это не так важно, не так ли? –

ответ

0

Может быть, как это (если вы хотите 4 пробелов между столбцами, в зависимости от самого длинного элемента каждого столбца):

#! /usr/bin/python3 

def printGrid (it, columns): 
    items = ['{} {}'.format (idx, item) for idx, item in enumerate (it) ] 
    maxWidths = [max (len (item) for item in items [col::columns]) for col in range (columns) ] 
    padded = [item + ' ' * (4 + maxWidths [idx % columns] - len (item)) for idx, item in enumerate (items) ] 
    while True: 
     if not padded: break 
     items = padded [:columns] 
     padded = padded [columns:] 
     print (' '.join (items)) 

data = 'Banana,Apple,Orange,Pear,Grape,Coconut,Test1,Test2,Test3,Test4,TestTest5,TestTest6,Test7'.split (',') 
printGrid (data, 3) 

Или с помощью встроенных форматов:

def printGrid (it, columns): 
    items = ['{} {}'.format (idx, item) for idx, item in enumerate (it) ] 
    maxWidths = [max (4 + len (item) for item in items [col::columns]) for col in range (columns) ] 
    formatStr = ''.join ('{{:<{}}}'.format (width) for width in maxWidths) 
    while True: 
     if not items: break 
     line = items [:columns] 
     items = items [columns:] 
     while len (line) < columns: line.append ('') 
     print (formatStr.format (*line)) 

Пояснение:

items строит список элементов, отформатированный как индекс + пробел + п

maxWidth вычисляет максимальную ширину для каждого столбца

(1-й фрагмент код :) padded колодки каждой запись в соответствии с его колонкой

(второй сниппета :) formatStr делает то, что вы просили: «изменить% -13s в зависимости от длины выше/пыльника строк» ​​

(второй фрагмент :) while len...: подушечки линии, поэтому formatStr получает нужное количество аргументов

Остальное - печать.

+0

Это работает безупречно, может объясниться? Я почти не понимаю. –

+0

@ f.rodrigues Я добавлю пояснения. – Hyperboreus

+0

@ f.rodrigues Done. Любые вопросы, просто стреляйте. – Hyperboreus

1

Вы можете сцепить число и строку первой перед форматированием:

for n, m in enumerate(grid): 
    if not n or n % 3: 
     line += "%-15s" % (str(n) + ' ' + m) 
    else: 
     whole += "%s\n" % line 
     line = "%-15s" % (str(n) + ' ' + m) 

, который производит:

0 Banana  1 Apple  2 Orange  
3 Pear   4 Grape  5 Coconut  
6 Test1  7 Test2  8 Test3   
9 Test4  10 TestTest5 11 TestTest6 

или вы можете форматировать номера для два позиций, выравнивание по правому краю:

for n, m in enumerate(grid): 
    if not n or n % 3: 
     line += "%2d %-12s" % (n, m) 
    else: 
     whole += "%s\n" % line 
     line = "%2d %-12s" % (n, m) 

который производит:

0 Banana  1 Apple  2 Orange  
3 Pear   4 Grape  5 Coconut  
6 Test1  7 Test2  8 Test3  
9 Test4  10 TestTest5 11 TestTest6 
+0

Это, несомненно, аккуратные таблицы, но это не отвечает на вопрос о фиксированном числе пробелов между столбцами. – Hyperboreus

+0

@Hyperboreus: Вопрос немного расплывчатый в этом вопросе.Но поскольку вы получили знак принятия, ваша интерпретация была явно ближе к знаку. :-) –

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