如何动态填充前导零(在函数中)?

时间:2013-05-09 22:33:26

标签: python

我知道"%03d"可以很容易地做到这一点,但我正在尝试解决一个稍微不同的问题。我的脚本的一部分,我需要找出一个范围(例如0-999)中有多少数字,其中至少有一个3(或任何数字)。所以,我想出了这个lambda函数:

fx = lambda z,y=999: [ "%03d" % (x, ) for x in range(y) if str(z) in str(x) ]

效果很好,但我希望根据范围自动填充“前导零”位。 003时为999或09为88等等。知道我该怎么办?

4 个答案:

答案 0 :(得分:4)

如果要将动态宽度传递给格式化函数,可以:

>>> width = 5
>>> value = 2
>>> '%0*d' % (width, value)
'00002'

使用新式格式化更容易,因为您可以在占位符中嵌入占位符:

>>> width = 5
>>> value = 2
>>> '{1:0{0}}'.format(width, value)
'00002'

如果您还想知道如何在输出之前获取所有值中的最长值,只要您可以迭代两次值,这很容易:

>>> values = 3, 100, 50000
>>> width = max(len('%0d' % value) for value in values)
>>> ', '.join('%0*d' % (width, value) for value in values)
'00003, 00100, 50000'

如果你想以参数为基础,那就更容易了:

fx = lambda z,y=999: [ "%0*d" % (len('%0d' % y), x) for x in range(y) if str(z) in str(x) ]

然而,这将一遍又一遍地计算y的宽度,因为在表达式中没有简单的方法来存储它,而lambda只能采用表达式。

这提出了为什么你首先使用lambda的问题。 lambda优于def的唯一优势是您可以在表达式中使用它,而不需要为它提供名称。如果您要将其分配给名称,则可以消除这两个优点。所以,就这样做:

def fx(z, y=999):
    width = len('%0d' % y)
    return ["0%*d" % (width, x) for x in range(y) if str(z) in str(x)]

答案 1 :(得分:1)

编辑:

以防万一有人看到这个,这是内置于python

>>> x = 'some'
>>> print(x.zfill(10))
000000some

老答案:

我必须使用空格做类似的事情来保持日志文件正确排列

def format(z, rge = 999):
    lenRange = len(str(range(rge)[-1]))
    z = str(z)
    lenZ = len(z)
    if lenZ<lenRange:
        z = (lenRange - lenZ)*'0'+z #heres where yours and mine differed, i used " " instead of "0"
    return z
>>>format(1)
'001'
>>>format(12)
'012'
>>>format(123)
'123'

你输入的任何东西都会以相同数量的字符输出...只是不要放在那里的任何东西大于范围内的最大数字(我猜它是一个范围......你可能不会这样做虽然)

编辑....实际上,我认为我误解了这个问题......生病了,以防它以某种方式设法帮助别人大声笑。

答案 2 :(得分:0)

如何使用`rjust&#39;而不是格式化?

fx = lambda z,y=999: [ str(x).rjust(len(str(y)), '0') for x in range(y) if str(z) in str(x) ]

这样,根据y的宽度,您将获得适当数量的&#39; 0&#39;

>>> fx(3, 10)
['03']
>>> fx(3, 100)
['003', '013', '023', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '043', '053', '063', '073', '083', '093']

答案 3 :(得分:0)

这个怎么样:

'%0*d' % (len(str(top)), i)