Python 字符串格式:填充负数

Python string formatting: padding negative numbers

我想将我的整数格式化为字符串,这样在没有符号的情况下,它们将被零填充以至少有两位数。

比如我要

1
-1
10
-10

成为

01
-01
10
-10

具体来说,我想要负数 (3) 和非负数 (2) 的不同最小字符串长度。详细 here 中的简单数字填充是不够的。这可能吗?

您可以使用 str.format,但在大小上加 1 以在此处考虑负数:

l = [1,-1,10,-10,4]

new_l = ["{1:0{0}d}".format(2 if x>=0 else 3,x) for x in l]

print(new_l)

结果:

['01', '-01', '10', '-10', '04']

之所以有效,是因为 format 接受嵌套表达式:您也可以将大小({:02d}{:03d})作为格式项传递,从而省去了格式化格式字符串的麻烦第一关。

使用"{:03d}".format(n)。 0 表示前导零,3 是字段宽度。可能不完全您想要的:

>>> for n in (-123,-12,-1,0,1,12,123, 1234):
...   print( '{:03d}'.format(n) )
... 
-123
-12
-01
000
001
012
123
1234

根据here,类型描述符前需要一个space,所以两者

'% d'%(1)

'{: d}'.format(1)

结果(注意 space)

' 1'

与上面用 -1 调用的结果很好地对齐:

'-1'

zfill 实际上在左边用零填充并考虑负数。

所以 n.zfill(3 if n < 0 else 2) 就可以了。

我能想到的(至少在 Python 3 中)最简洁但可能有点不可读的方式是带有嵌套花括号的 formatted string literal,类似于已接受的答案.有了这个,接受的答案的例子可以写成

l = [1, -1, 10, -10, 4]
new_l = [f"{x:0{2 + (x < 0)}d}" for x in l]
print(new_l)

结果相同:

['01', '-01', '10', '-10', '04']

使用zfill:

inp_list = [1,-1,10,-10,4]

out_list = [str(n).zfill(3 if n<0 else 2) for n in inp_list]

print(out_list)

结果:

['01', '-01', '10', '-10', '04']