我知道"%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等等。知道我该怎么办?
答案 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)