空数字类型int格式说明符

时间:2012-02-13 18:51:37

标签: python string-formatting format-specifiers

有没有办法将“空”数字类型传递给数字格式说明符并让它打印与该说明符关联的空格?

n = "Scientific:"
v = 123.321
strfmt = "%5.4E"
output = "%s|"+strfmt+"|"
print output % (n, v)

>   Scientific:|1.2332E+02|

v = EMPTY
print output % (n, v)

>   Scientific:|          |

最终目标是处理不完整的行而不会在循环时自适应地更改格式字符串

perline = 3
n = ["1st:","2nd:","3rd:","4th:","5th:","6th:"]
v = [1.0, 2.0, 3.0, 4.0]

strfmt = "%5.4E"
output = ("%s|"+strfmt+"|  ")*perline+"\n"

for args in map(EMPTY,*[iter(n),iter(v)]*perline):
    print output % args

>   1st:|1.0000E+00|  2nd:|2.0000E+00|  3rd:|3.0000E+00|
>   4th:|4.0000E+00|  5th:|          |  6th:|          |

要执行上面的代码,我将EMPTY替换为None,尽管在将None传递给格式字符串时会出现错误

6 个答案:

答案 0 :(得分:0)

仅使用数字格式,您将无法做到这一点。你需要一些逻辑:

strfmt = "%5.4E"
v = None

if v in [None, '']:
  output = "%s|          |"
else:
  output = "%s|"+strfmt+"|"

答案 1 :(得分:0)

一种选择是将output中的数字格式替换为%s,然后在替换元组中创建正确的数字输出或空白空间,具体取决于v是什么:

>>> v = 123.321
>>> "%s|%s|" % (n, "%5.4E" % v if v is not None else " "*10)
'Scientific:|1.2332E+02|'
>>> v = None
>>> "%s|%s|" % (n, "%5.4E" % v if v is not None else " "*10)
'Scientific:|          |'

通过简单的闭包,你可以使它更具功能性:

def make_default_blank_formatter(format, default):
    def default_blank_formatter(v):
        return format % v if v is not None else default
    return default_blank_formatter

scientific_formatter = make_default_blank_formatter("%5.4E", " "*10)

>>> v = 123.321
>>> "%s|%s|" % (n, scientific_formatter(v))
'Scientific:|1.2332E+02|'
>>> v = None
>>> "%s|%s|" % (n, scientific_formatter(v))
'Scientific:|          |'

编辑:以下是修改打印代码的方法:

perline = 3
n = ["1st:","2nd:","3rd:","4th:","5th:","6th:"]
v = [1.0, 2.0, 3.0, 4.0, None, None]

strfmt = "%5.4E"
output = ("%s|%s|  ")*perline

for args in zip(*[iter(n),iter(map(scientific_formatter, v))]*perline):
    print output % args

答案 2 :(得分:0)

简短回答:对于字段 n 位置较宽,'% n s'%''可以。也就是说,'%15s' % ''将打印15个空格。

答案很长:当您使用格式说明符the first number is the minimum width of the entire field指定宽度时。但是,"%5.4E"将占用超过5个位置,因为只有指数才会占用3个位置。

指定"%12.4E"之类的内容并获得一致的结果。对于缺失值,请指定"%12s"并传递空字符串(不是None)而不是值。

答案 3 :(得分:0)

您可以使用itertools.izip_longest配对nv中的项目,并使用空字符串填充缺失值。

要为v中的项目获取正确的格式,您可以使用strfmt预先设置浮点格式,并使用类似

的内容
output = "%s|%10s|  "

加入nv中的项目。通过这种方式,v中的项目现在都是字符串,包括空字符串,而不是浮点数和空字符串的混合。


import itertools

perline = 3
n = ["1st:", "2nd:", "3rd:", "4th:", "5th:", "6th:"]
v = [1.0, 2.0, 3.0, 4.0]

strfmt = "%5.4E"
v = (strfmt % val for val in v)
output = "%s|%10s|  "

pairs = itertools.izip_longest(n, v, fillvalue = '')
items = (output % (place, val) for place, val in pairs)
for row in zip(*[items]*perline):
    print(''.join(row))

产量

1st:|1.0000E+00|  2nd:|2.0000E+00|  3rd:|3.0000E+00|  
4th:|4.0000E+00|  5th:|          |  6th:|          |  

答案 4 :(得分:0)

如上所述,只需在打印前将数字转换为字符串,然后将缺少的数字替换为等长的空字符串。这实际上可以写得非常紧凑,但我绝不会在严肃的代码中使用它:

from itertools import izip_longest, groupby, chain

perline = 3
n = ["1st:","2nd:","3rd:","4th:","5th:","6th:"]
v = [1.0, 2.0, 3.0, 4.0]

strfmt = "%5.4E"
output = ("%s|%s|  ")*perline

for _, args in groupby(enumerate(chain(*izip_longest(n, (strfmt % x for x in v),
                                                     fillvalue = ' '*len(strfmt % 0)))),
                       lambda (i, v): i/perline/2):
    print output % zip(*args)[1]

最后一个循环的可读性和可靠性更高版本:

l = ()
for pair in izip_longest(n, (strfmt % x for x in v),
                         fillvalue = ' '*len(strfmt % 0)):
    l += pair
    if len(l) == perline*2:
        print output % l
        l = ()

答案 5 :(得分:0)

在查看响应之后,似乎没有任何东西可以传递给数字格式说明符,以使其打印与其关联的空白区域。

有很多方法可以解决此问题。就个人而言,我喜欢Unutbu的部分答案。我认为我最终会这样做的方法是在开头创建两个格式说明符,并使用Blender建议的逻辑。