1

我知道这"%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

4 回答 4

5

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

>>> 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一遍又一遍地计算宽度,因为在表达式内部没有简单的方法来存储它,并且 alambda只能接受一个表达式。

这就提出了一个问题,即你为什么首先使用 a lambdalambdaover的唯一优点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)]
于 2013-05-09T22:40:37.810 回答
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'

您放入其中的任何内容都将以相同数量的字符输出...只是不要在其中放入任何大于该范围内最大数字的内容(我想因为它是一个范围...。不过您可能不会这样做)

编辑....实际上我认为我误解了这个问题....我会留下这个,以防它以某种方式设法帮助别人哈哈。

于 2013-05-09T23:13:18.983 回答
0

使用“rjust”而不是格式化它怎么样?

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

这样,根据 的宽度y,您将获得适当数量的“0”:

>>> 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']
于 2013-05-09T22:38:18.223 回答
0

这个怎么样:

'%0*d' % (len(str(top)), i)
于 2013-05-09T22:40:11.487 回答