Форматировать строку динамически
Если я хочу сделать мою форматированную строку динамически настраиваемой, я могу изменить следующий код из
print '%20s : %20s' % ("Python", "Very Good")
в
width = 20
print ('%' + str(width) + : %' + str(width) + 's') % ("Python", "Very Good")
Однако, кажется, что объединение строк здесь громоздко. Любой другой способ упростить вещи?
Ответы
Ответ 1
Вы можете получить значение прокладки из списка аргументов:
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])
Ответ 2
Вы можете сделать это, используя метод 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'
Ответ 3
print '%*s : %*s' % (width, 'Python', width, 'Very Good')
Ответ 4
Если вы не хотите указывать ширину одновременно, вы можете подготовить форматированную строку раньше времени, как вы делали, - но с другой заменой. Мы используем %%
, чтобы избежать фактических знаков% в строке. Мы хотим заключить %20s
в нашу строку формата, когда ширина равна 20, поэтому мы используем %%%ds
и предоставляем переменную ширины для замены там. Первые два символа% становятся буквальными%, а затем% d заменяется переменной.
Таким образом:
format_template = '%%%ds : %%%ds'
# later:
width = 20
formatter = format_template % (width, width)
# even later:
print formatter % ('Python', 'Very Good')
Ответ 5
Для тех, кто хочет сделать то же самое с python 3. 6+ и f-Strings это решение.
width = 20
py, vg = "Python", "Very Good"
print(f"{py:>{width}s} : {vg:>{width}s}")