Переменная длина% s с оператором% в python
Я пытаюсь сделать это:
max_title_width = max([len(text) for text in columns])
for column in columns:
print "%10s, blah" % column
Но я хочу заменить 10
на значение max_title_width
. Как я могу сделать это максимально возможным для pythonic?
Ответы
Ответ 1
Это перенос с разметки форматирования C:
print "%*s, blah" % (max_title_width,column)
Если вы хотите текст с левым выравниванием (для записей короче max_title_width
), поместите '-' перед '*'.
>>> text = "abcdef"
>>> print "<%*s>" % (len(text)+2,text)
< abcdef>
>>> print "<%-*s>" % (len(text)+2,text)
<abcdef >
>>>
Если поле len короче текстовой строки, строка просто переполняется:
>>> print "<%*s>" % (len(text)-2,text)
<abcdef>
Если вы хотите клип на максимальной длине, используйте '.' прецизионное поле заполнителя формата:
>>> print "<%.*s>" % (len(text)-2,text)
<abcd>
Поместите их все вместе следующим образом:
%
- if left justified
* or integer - min width (if '*', insert variable length in data tuple)
.* or .integer - max width (if '*', insert variable length in data tuple)
Ответ 2
У вас есть методы форматирования новых строк из Python 3 и Python 2.6.
Начиная с Python 2.6, встроенные классы str и unicode предоставляют возможность выполнять сложные подстановки переменных и форматирование значений с помощью метода str.format(), описанного в PEP 3101. Класс Formatter в строчном модуле позволяет вам создавать и настраивать собственные методы форматирования строк, используя ту же реализацию, что и встроенный метод format().
(...)
Например,, Предположим, вы хотели иметь поле замены, ширина поля которого определяется другой переменной:
>>> "A man with two {0:{1}}.".format("noses", 10)
"A man with two noses ."
>>> print("A man with two {0:{1}}.".format("noses", 10))
A man with two noses .
Итак, для вашего примера это будет
max_title_width = max(len(text) for text in columns)
for column in columns:
print "A man with two {0:{1}}".format(column, max_title_width)
Мне лично нравятся новые методы форматирования, поскольку они гораздо более мощные и читаемые по моему скромному мнению.
Ответ 3
Примеры альтернативных версий Python 2.6+:
>>> '{:{n}s}, blah'.format('column', n=10)
'column , blah'
>>> '{:*>{l}s}'.format(password[-3:], l=len(password)) # password = 'stackoverflow'
'**********low'
>>> '{:,.{n}f} {}'.format(1234.567, 'USD', n=2)
'1,234.57 USD'
Совет: сначала не ключевое слово args, затем ключевое слово args.
Ответ 4
вы можете создать свой шаблон вне цикла:
tmpl = '%%%ds, blah' % max_title_width
for column in columns:
print tmpl % column
Вы также можете узнать о новом форматировании в python.
и btw, max
не требует списка, вы можете передать его итерабельным:
max_title_width = max(len(i) for i in columns)