Как обернуть текст? - PullRequest
       1

Как обернуть текст?

0 голосов
/ 15 октября 2019

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

[TEXT1, TEXT2, TEXT3, TEXT4, TEXT5, TEXT6, TEXT7, TEXT8, TEXT9]

Ожидаемый вывод: ('~' представляет пробел в документе)

~~~~~~~~~~TEXT1, TEXT2, TEXT3, TEXT4, TEXT5,
~~~~~~~~~~TEXT6, TEXT7, TEXT8, TEXT9

Проблема, с которой я столкнулся, добавляет TEXT2 после TEXT1, без повторного добавления пробела ('~').

a = ['A121', 'A221', 'A321', 'A421', 'A521', 'A621', 'A721', 'A821', 'A921']

for v in a:
    counter = 0
    if counter == 5:
        print '\n'
    print "                {},".format(v.ljust(0)),

Вывод:

                A121                 A221                 A321                 A421                 A521                 A621                 A721                 A821                 A921

Ожидаетсявывод:

                A121, A221, A321, A421, A521,
                A621, A721, A821, A921

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Существует много способов решения этой проблемы:

Один:

a = ['A121', 'A221', 'A321', 'A421', 'A521', 'A621', 'A721', 'A821', 'A921']

INDENT = ' '*10
NUMBER_OF_COLUMNS = 5

lead = INDENT
for item_number, item in enumerate(a):
    print("{lead}{item}".format(lead=lead, item=item), end='')

    if item_number % NUMBER_OF_COLUMNS == NUMBER_OF_COLUMNS - 1:
        lead = ",\n" + INDENT
    else:
        lead = ", "

Два:

table = []
row = []

for item in a:
    row.append(item)
    if len(row) == NUMBER_OF_COLUMNS:
        table.append(INDENT + ', '.join(row))
        row = []

table.append(INDENT + ', '.join(row))

print(',\n'.join(table))

Три, однострочный:

print(',\n'.join(INDENT + ', '.join(a[i:i + NUMBER_OR_COLUMNS]) for i in range(0, len(a), NUMBER_OR_COLUMNS)))

Или, возможно, сработает textwrap.fill ():

from textwrap import fill

print(fill(', '.join(a), initial_indent=10*' ', subsequent_indent=10*' ', width=40))

Весь вывод (с запятыми в вашем примере):

          A121, A221, A321, A421, A521,
          A621, A721, A821, A921
1 голос
/ 15 октября 2019

Вот довольно общий, краткий и эффективный способ сделать это:

import textwrap
from itertools import zip_longest

def grouper(n, iterable, _SENTINEL=object()):
    """ Collect data into fixed-length chunks or blocks. """
    args = [iter(iterable)] * n
    for t in zip_longest(*args, fillvalue=_SENTINEL):
        yield list(elem for elem in t if elem is not _SENTINEL)

def text_wrap(words, numcols, indent=0):
    lines = (' '.join(group) for group in grouper(numcols, words))
    return textwrap.indent('\n'.join(lines), indent*' ')


if __name__ == '__main__':

    a = 'A121', 'A221', 'A321', 'A421', 'A521', 'A621', 'A721', 'A821', 'A921'
    lines = text_wrap(a, 5, 8)
    print(lines)

Вывод:

        A121 A221 A321 A421 A521
        A621 A721 A821 A921
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...