2013-05-09 49 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' 

你放在這裏的任何東西都會以相同數量的字符輸出......只是不要把任何東西放在那裏,而不是在範圍內的最大數字(我猜是因爲它的範圍......你可能不會這麼做雖然)

編輯....實際上我認爲我誤解了這個問題....生病離開這個以防萬一它設法幫助別人大聲笑。