2013-05-09 48 views
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等等。任何想法我怎么能做到这一点?

+0

是否有这个标签'lambda'和'lambda-functions'的原因?首先,为什么这首'lambda'而不是'def'呢?其次,这个问题的任何一种方式如何? – abarnert 2013-05-09 22:48:11

+0

lambda的目的是做快速的匿名函数,一旦你指定它,它不再是匿名的,你最好使用标准的“def myfuc()”。 – monkut 2013-05-09 22:54:23

+0

@abarnert:我为lambda标签道歉;现在删除。 – MacUsers 2013-05-09 23:00:18

回答

3

如果你想通过动态宽度格式化功能,您可以:

>>> 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)] 
+0

非常有用和有用的信息;回答我的问题。感谢“新式”格式 - 不要忘记它。只有一个问题,输出成为str的列表而不是int,因此不需要进一步计算,如总结数字等是可能的。我怎样才能输出一个整数列表?干杯!! – MacUsers 2013-05-09 23:13:57

+0

您不能返回0填充整数列表,因为_int_不能填充0。 '0123'与'00123'完全相同,对吧? (为了使它更有趣,它们与'83'相同,而不是'123',看看你能猜出原因。)只有_strings_可以被填充0。 “0123”与_ 00123不是同一个字符串,对吗? – abarnert 2013-05-09 23:16:46

+0

也许你想要做的就是把它分开。首先,返回数字列表,'如果str(x)中的str(z)]'是'[x for x in range(y)]。将数字传递到任何地方,但是无论您想要将它们打印出来,都可以从该列表中随时创建0填充的字符串。那有意义吗? – abarnert 2013-05-09 23:18:30

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'] 
0

如何:

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

编辑:

万一有人新的在看这个,这是内建在Python中

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

OLD答:

我用空格做类似的事情,以保持日志文件的正确排列

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' 

你放在这里的任何东西都会以相同数量的字符输出......只是不要把任何东西放在那里,而不是在范围内的最大数字(我猜是因为它的范围......你可能不会这么做虽然)

编辑....实际上我认为我误解了这个问题....生病离开这个以防万一它设法帮助别人大声笑。