我知道"%03d"可以很容易地做到这一点,但是我正在尝试解决一个稍微不同的问题。在脚本的一部分中,我需要找出一个范围(例如0-999)中有多少个数字,其中至少有一个3(或任何有问题的数字)。因此,我想到了这个lambda函数:
fx = lambda z,y=999: [ "%03d" % (x, ) for x in range(y) if str(z) in str(x) ]
Run Code Online (Sandbox Code Playgroud)
这是很好的工作,但我想根据范围自动填充填充的“前导零”位,例如003时为999或88时为09等等。知道我该怎么做吗?
如果要将动态宽度传递给格式化功能,则可以:
>>> width = 5
>>> value = 2
>>> '%0*d' % (width, value)
'00002'
Run Code Online (Sandbox Code Playgroud)
使用新型格式更容易,因为您可以将占位符嵌入占位符内:
>>> width = 5
>>> value = 2
>>> '{1:0{0}}'.format(width, value)
'00002'
Run Code Online (Sandbox Code Playgroud)
如果您还想知道如何在输出所有值之前获得最长的值,只要您可以对这些值进行两次迭代,这很简单:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
而且,如果您想将其基于参数,那就更简单了:
fx = lambda z,y=999: [ "%0*d" % (len('%0d' % y), x) for x in range(y) if str(z) in str(x) ]
Run Code Online (Sandbox Code Playgroud)
但是,这将要计算出y一遍又一遍的宽度,因为在表达式内部没有简单的存储方法,而a lambda只能接受一个表达式。
这就提出了一个问题,为什么您首先要使用a lambda。lambdaover 的唯一优点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)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
768 次 |
| 最近记录: |