在python中使用%运算符的%s的可变长度

时间:2009-09-19 15:56:39

标签: python

我正在尝试这样做:

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

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

但我想将10替换为max_title_width的值。我怎么用最蟒蛇的方式做到这一点?

4 个答案:

答案 0 :(得分:46)

这是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)

答案 1 :(得分:22)

你有Python 3和Python 2.6的新字符串格式化方法。

  

从Python 2.6开始,内置的str和unicode类提供了通过PEP 3101中描述的str.format()方法进行复杂变量替换和值格式化的功能。字符串模块中的Formatter类允许您使用与内置format()方法相同的实现创建和自定义您自己的字符串格式化行为。

     

(...)

     

For example假设您想要一个替换字段,其字段宽度由另一个变量确定

>>> "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)

我个人喜欢新的格式化方法,因为在我的拙见中它们更强大,更易读。

答案 2 :(得分: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。

答案 3 :(得分:2)

你可以在循环之外创建你的模板:

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

您还可以了解python中的new formatting

和btw,max不需要列表,你可以传递一个可迭代的:

max_title_width = max(len(i) for i in columns)