колоночный цикл вывода в Python - PullRequest
0 голосов
/ 20 октября 2018

У меня есть код в Python, например, так:

def sth(mlist):
    for line in mlist:
        out = func(param1, param2)
        if out:
            print " [+] %-15s %20s " % (line, out.rjust(30, '.'))
        else:
            a = 'Not Covered!!'
            print " [-] %-15s %20s " % (target, a.rjust(30, '.'))

, и я получаю неприятный вывод при запуске кода:

 [-] http://a.com .................Not Covered!! 
 [-] http://abcd.info .................Not Covered!! 
 [+] http://abcdef.net ....................something  
 [-] https://c.com .................Not Covered!! 
 [+] https://efghij.org .................other thing
.
.
.

Как я могу получить наилучшую форму выводадля таких потоков, например, что-то вроде:

 [-] http://a.com ......................... Not Covered!! 
 [-] http://abcd.info ..................... Not Covered!! 
 [+] http://abcdef.net .................... something  
 [-] https://c.com ........................ Not Covered!! 
 [+] https://efghij.org ................... other thing
.
.
.

Примечание:

Даже другие решения, отличные от ljust, также приветствуются.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вы можете предварительно вычислить самый длинный URL и left -обосновать эту запись точками, чтобы она лучше сочеталась:

In [5]: signs = ['-', '+', '-']
   ...: URLs = ['http://foo.com', 'http://much_longer_foo.com', 'http://medium_foo.com']
   ...: tails = ['Longer shouting ending!!', 'different ending', 'Longer shouting ending!!']
   ...: 
   ...: maxlen = max(map(len,URLs))
   ...: linefmt = " [{{sign}}] {{URL:.<{maxlen}}}{{tail:.>30}}".format(maxlen=maxlen)
   ...: for sign,URL,tail in zip(signs,URLs,tails):
   ...:     print linefmt.format(sign=sign, URL=URL, tail=tail)
   ...:     
 [-] http://foo.com..................Longer shouting ending!!
 [+] http://much_longer_foo.com..............different ending
 [-] http://medium_foo.com...........Longer shouting ending!!

Как видите, я изменилк использованию .format вместо процентного форматирования.Это в основном вопрос предпочтения.

Важно то, что мы сначала строим строку формата с длиной самого длинного URL, а затем используем полученную строку формата.Результат немного отличается от того, что вы ожидаете: вокруг точек нет пробелов.Вы можете добавить их вручную, если вы настаиваете на их наличии.

Обратите внимание, что в Python 3.6 и выше вы можете использовать f-strings , чтобы сделать это более элегантно:

In [1]: signs = ['-', '+', '-']
   ...: URLs = ['http://foo.com', 'http://much_longer_foo.com', 'http://medium_foo.com']
   ...: tails = ['Longer shouting ending!!', 'different ending', 'Longer shouting ending!!']
   ...: 
   ...: maxlen = max(map(len,URLs))
   ...: for sign,URL,tail in zip(signs,URLs,tails):
   ...:     print(f' [{sign}] {URL:.<{maxlen}}{tail:.>30}')
   ...: 
   ...:     
 [-] http://foo.com..................Longer shouting ending!!
 [+] http://much_longer_foo.com..............different ending
 [-] http://medium_foo.com...........Longer shouting ending!!

Также, как вы можете видеть, я бы предложил использовать одну строку формата и передать ей знак / URL / окончание отдельно.Это поможет вам уменьшить повторение кода и упростить поддержку.

0 голосов
/ 20 октября 2018

Ну, так как вы открыты для решений, которые не используют rjust или ljust, вы можете решить, сколько . вы хотите распечатать и вычесть len из line из этого.

Краткий пример:

print(' [+] {0} {1} {2}'.format(line, '.' * (50 - len(line)), out))
...