如何将打印输出格式化为固定宽度?

我有这个代码(打印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