如何将打印输出格式化为固定宽度?
我有这个代码(打印string中的所有排列的发生)
def splitter(str): for i in range(1, len(str)): start = str[0:i] end = str[i:] yield (start, end) for split in splitter(end): result = [start] result.extend(split) yield result el =[]; string = "abcd" for b in splitter("abcd"): el.extend(b); unique = sorted(set(el)); for prefix in unique: if prefix != "": print "value " , prefix , "- num of occurrences = " , string.count(str(prefix));
我想打印所有在stringvariables中出现的排列。
因为排列的长度不是相同的,所以我想修复宽度并打印出来,不像这样:
value a - num of occurrences = 1 value ab - num of occurrences = 1 value abc - num of occurrences = 1 value b - num of occurrences = 1 value bc - num of occurrences = 1 value bcd - num of occurrences = 1 value c - num of occurrences = 1 value cd - num of occurrences = 1 value d - num of occurrences = 1
我如何使用format
来做到这一点?
我发现这些post,但它不符合字母数字string:
pythonstring格式化固定宽度
用python设置固定的长度
编辑12.11.2013 – 这个答案是非常古老的。 它仍然是有效和正确的,但是看这个的人应该更喜欢新的格式语法 。
你可以像这样使用string格式 :
>>> print '%5s' % 'aa' aa >>> print '%5s' % 'aaa' aaa >>> print '%5s' % 'aaaa' aaaa >>> print '%5s' % 'aaaaa' aaaaa
基本上:
-
%
字符通知python它将不得不replace一个标记的东西 -
s
字符通知python令牌将是一个string -
5
(或任何你想要的数字)通知python填充空格最多5个字符的string。
在您的具体情况下,可能的实现可能如下所示:
>>> dict_ = {'a': 1, 'ab': 1, 'abc': 1} >>> for item in dict_.items(): ... print 'value %3s - num of occurances = %d' % item # %d is the token of integers ... value a - num of occurances = 1 value ab - num of occurances = 1 value abc - num of occurances = 1
边注意:只是想知道你是否知道itertools
模块的存在。 例如,您可以在一行中获得所有组合的列表:
>>> [''.join(perm) for i in range(1, len(s)) for perm in it.permutations(s, i)] ['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'ba', 'bc', 'bd', 'ca', 'cb', 'cd', 'da', 'db', 'dc', 'abc', 'abd', 'acb', 'acd', 'adb', 'adc', 'bac', 'bad', 'bca', 'bcd', 'bda', 'bdc', 'cab', 'cad', 'cba', 'cbd', 'cda', 'cdb', 'dab', 'dac', 'dba', 'dbc', 'dca', 'dcb']
你可以通过结合使用count()
来获得发生count()
。
我发现使用str.format
更优雅:
>>> '{0: <5}'.format('ss') 'ss ' >>> '{0: <5}'.format('sss') 'sss ' >>> '{0: <5}'.format('ssss') 'ssss ' >>> '{0: <5}'.format('sssss') 'sssss'
如果你喜欢stringalignment到正确的使用>
而不是<
:
>>> '{0: >5}'.format('ss') ' ss'
编辑:正如在评论中提到的:0表示格式参数的索引。
最初发布为@ 0x90的答案编辑,但由于偏离post的原始意图而被拒绝,并build议发表评论或答案,所以我在这里包括简短的文字。
除了来自@ 0x90的答案之外,通过使用宽度variables(根据@ user2763554的注释),语法可以变得更加灵活:
width=10 '{0: <{width}}'.format('sss', width=width)
此外,只需使用数字并依靠传递给format
的参数的顺序,就可以使这个expression式变得更加简短:
width=10 '{0: <{1}}'.format('sss', width)
或者甚至忽略所有的数字,以最大的,可能非pythonically隐式,紧凑性:
width=10 '{: <{}}'.format('sss', width)
更新2017-05-26
在Python 3.6中引入了格式化的string文字 (简称“f-strings”),现在可以用简单的语法访问以前定义的variables:
>>> name = "Fred" >>> f"He said his name is {name}." 'He said his name is Fred.'
这也适用于string格式
>>> width=10 >>> string = 'sss' >>> f'{string: <{width}}' 'sss '
format
绝对是最优雅的方式,但afaik你不能用python的logging
模块,所以这里是如何使用%
格式来做到这一点:
formatter = logging.Formatter( fmt='%(asctime)s | %(name)-20s | %(levelname)-10s | %(message)s', )
这里, -
表示左alignment, s
之前s
数字表示固定的宽度。
一些示例输出:
2017-03-14 14:43:42,581 | this-app | INFO | running main 2017-03-14 14:43:42,581 | this-app.aux | DEBUG | 5 is an int! 2017-03-14 14:43:42,581 | this-app.aux | INFO | hello 2017-03-14 14:43:42,581 | this-app | ERROR | failed running main
更多信息在这里的文档: https : //docs.python.org/2/library/stdtypes.html#string-formatting-operations