Форматировать строку динамически - PullRequest
39 голосов
/ 29 ноября 2010

Если я хочу сделать мою форматированную строку динамически настраиваемой, я изменю следующий код с

print '%20s : %20s' % ("Python", "Very Good")

до

width = 20
print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good")

Однако, кажется, что объединение строк здесь громоздко. Любой другой способ упростить это?

Ответы [ 5 ]

58 голосов
/ 06 апреля 2016

Вы можете сделать это, используя метод str.format().

>>> width = 20
>>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width))
              Python :            Very Good

Начиная с Python 3.6, вы можете использовать f-string для этого:

In [579]: lang = 'Python'

In [580]: adj = 'Very Good'

In [581]: width = 20

In [582]: f'{lang:>{width}}: {adj:>{width}}'
Out[582]: '              Python:            Very Good'
29 голосов
/ 29 ноября 2010

Вы можете получить значение отступа из списка аргументов:

print '%*s : %*s' % (20, "Python", 20, "Very Good")

Вы даже можете вставить значения заполнения динамически:

width = 20
args = ("Python", "Very Good")
padded_args = zip([width] * len(args), args)
# Flatten the padded argument list.
print "%*s : %*s" % tuple([item for list in padded_args for item in list])
6 голосов
/ 29 ноября 2010
print '%*s : %*s' % (width, 'Python', width, 'Very Good')
2 голосов
/ 29 ноября 2010

Если вы не хотите указывать ширину одновременно, вы можете подготовить строку формата заранее, как вы это делали, но с другой заменой.Мы используем %% для экранирования реальных символов% в строке.Мы хотим получить %20s в нашей строке формата, когда ширина равна 20, поэтому мы используем %%%ds и предоставляем переменную ширины для замены там.Первые два знака% становятся буквальными%, а затем% d заменяется переменной.

Таким образом:

format_template = '%%%ds : %%%ds'
# later:
width = 20
formatter = format_template % (width, width)
# even later:
print formatter % ('Python', 'Very Good')
1 голос
/ 23 апреля 2019

Для тех, кто хочет сделать то же самое с python 3.6+ и f-Strings это решение.

width = 20
py, vg = "Python", "Very Good"
print(f"{py:>{width}s} : {vg:>{width}s}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...