переменная длина% s с оператором% в python - PullRequest
20 голосов
/ 19 сентября 2009

Я пытаюсь сделать это:

max_title_width = max([len(text) for text in columns])

for column in columns:
    print "%10s, blah" % column

Но я хочу заменить 10 значением max_title_width. Как мне сделать это самым питонским способом?

Ответы [ 4 ]

46 голосов
/ 19 сентября 2009

Это перенос из разметки форматирования 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)
22 голосов
/ 19 сентября 2009

У вас есть новые методы форматирования строк из Python 3 и Python 2.6.

Начиная с Python 2.6, встроенные классы str и unicode предоставляют возможность выполнять сложные подстановки переменных и форматирование значений с помощью метода str.format (), описанного в PEP 3101. Класс Formatter в модуле string позволяет вам создавать и настраивать свои собственные способы форматирования строк, используя ту же реализацию, что и встроенный метод 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 голосов
/ 03 августа 2013

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'

Подсказка: сначала аргументы без ключевых слов, затем аргументы с ключевыми словами.

2 голосов
/ 19 сентября 2009

вы можете создать свой шаблон вне цикла:

tmpl = '%%%ds, blah' % max_title_width
for column in columns:
    print tmpl % column

Вы также можете узнать о новом форматировании в python.

и, кстати, max не требует списка, вы можете передать его итеративно:

max_title_width = max(len(i) for i in columns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...