2013-09-20 2 views
2

Я пытаюсь написать список строк с определенным количеством столбцов. Например, возьмет список:Запись в список строк с определенным количеством столбцов

data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] 

Я хотел бы написать это с таким форматом, что он выглядит как:

1.0, 2.0, 3.0, 
4.0, 5.0, 6.0, 
7.0, 8.0, 9.0, 
10.0, 

Я попытался следующий код; однако может получить только распечатку первой строки:

strformat = ['{'+str(i)+':>5.1f},' for i in range(0,3)] 
strformat = ''.join(strformat).lstrip().rstrip() + '\n' 
print strformat.format(*[x for x in data]) 

Заранее благодарим за внимание!

+0

Спасибо всем за ваши предложения ! – user877334

ответ

1
def chunks(seq, n): 
    # http://stackoverflow.com/a/312464/190597 (Ned Batchelder) 
    """ Yield successive n-sized chunks from seq.""" 
    for i in xrange(0, len(seq), n): 
     yield seq[i:i + n] 

data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] 
for row in chunks(data, 3): 
    print(', '.join(map(str, row))) 

дает

1.0, 2.0, 3.0 
4.0, 5.0, 6.0 
7.0, 8.0, 9.0 
10.0 

Или, возможно, ближе к коду:

strformat = '\n'.join(
    ', '.join('{:>5.1f}' for item in row) 
    for row in chunks(data, 3)) 
print(strformat.format(*data)) 
+0

Мы не можем просто использовать инструкцию генератора вместо 'chunks'? – oleg

+0

@oleg: Конечно, мы можем! Но мне не нравится смотреть на мелочи, детализированные внутри куска. Когда я читаю код, я хочу видеть намерение, а не реализацию. Поскольку стремление к детализации вещей настолько распространено, я бы предпочел его кодифицировать в функции полезности. – unutbu

+0

Еще одна причина использовать «куски» - если в какой-то момент пользователю нужно 4 столбца вместо 3, вам нужно только изменить число в одном месте вместо двух, тем самым исключая потенциальный источник ошибки. – unutbu

1

Итак, вы на самом деле пытаетесь сделать две вещи здесь.

Во-первых, вы пытаетесь координировать свой список (преобразуйте его в новую структуру, содержащую три элемента в каждом элементе). Вы можете написать функцию, которая выглядит примерно так:

def columnize(data, columns): 
    for i in xrange(0, len(data), columns): 
     yield data[i:i+columns] 

Затем вы хотите распечатать их в указанном формате. То, что у вас есть, работоспособно, но вы можете сделать его немного проще, пропуская позиционные аргументы. Вместо '{0} {1} {2}' вы можете просто поставить '{} {} {}', потому что аргументы отформатированы по порядку. Код печати будет выглядеть следующим образом:

columns = 3 
for row in columnize(data, columns): 
    strformat = '{:>5.1f},' * len(row) 
    print strformat.format(*row) 

Обратите внимание, что мы можем обрабатывать случай последней строки только с помощью оператора умножения строки; в большинстве случаев строка будет иметь 3 элемента, но на последнем она имеет только один.

1

Ну, это довольно простой способ; разделяя список через равные промежутки времени. Он также печатает с выравниванием по правому краю в зависимости от длины самого длинного элемента в списке. Не очень ужасно лаконично, но мне кажется, что вы после.

data = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] 
width = 3 

table = [data[x:x+width] for x in range(0, len(data), width)] 
alignment = len(str(max(data))) 

for i in table: 
    for j in i: 
     print "%s," % str(j).rjust(alignment), 
    print 

1.0, 2.0, 3.0, 
4.0, 5.0, 6.0, 
7.0, 8.0, 9.0, 
10.0, 

И с более пунктов:

1.0, 2.0, 3.0, 
400.0, 5000.0, 6.0, 
    7.0, 8.0, 9.0, 
    10.0, 
0

Я люблю Joseph «ы решений, может быть, просто ...

print "%s," % str(j).rjust(alignment, ' '),

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