2014-02-20 103 views
0

我剛剛做了一個函數來生成給定範圍之間的運行ID列表。 ID以字母開頭,後跟5個數字(例如A00002)。下面的函數工作,但我想知道是否有一個更乾淨的方法來做到這一點。謝謝!一種更清潔的方式來生成運行ID列表

def running_ids(start, end): 
list = [] 
start = int(start[1:]) 
end = int(end[1:]) 
steps = end - start 

def zeros(n): 
    zeros = 5 - len(str(n)) 
    return zeros 

while start <= end: 
    string = "A" + "0"*zeros(start) + str(start) 
    list.append(string) 
    start += 1 

return list 

打印running_ids( 'A00001', 'A00005')

[ 'A00001', 'A00002', 'A00003', 'A00004', 'A00005']

+0

什麼語言呢? - >使用標籤... – DotNetDeveloper

+0

'A99999'後你想要發生什麼? – DSM

+0

我可能只是改變起始字母。我不認爲我的廣告資源會違反ID限制。乾杯。 –

回答

3

使用generator。這樣您可以根據需要生成數字,而不是一次全部存儲它們。它還維護您的計數器的狀態,如果您開始構建大型項目並且忘記將其添加到索引中,那麼它很有用。這是編程的Python中一個非常強大的方式:

def running_id(): 
    n = 1 
    while True: 
     yield 'A{0:05d}'.format(n) 
     n += 1 

C = running_id() 
for n in xrange(5): 
    print next(C) 

,並提供:

A00001 
A00002 
A00003 
A00004 
A00005 
+0

對於前向兼容性,更喜歡'next(C)'。 – DSM

+0

@DSM謝謝。有沒有一個Python的版本,其中'C.next()'工作,但下一個(C)'不? – Hooked

+0

啊,你說得對。 2.4,例如..和2.5 ..似乎在2.6。 – DSM

3

你可以只使用簡單的內置的字符串格式化:

>>> 'A%05d'%1 
'A00001' 
>>> 'A{0:05d}'.format(1) 
'A00001' 
+1

對於OP:我相信.format是建議的字符串格式化方法。 –

1

您可以使用內置的format方法

print "A" + format(1, "05d") # A00001 
print "A" + format(100, "05d") # A00100 

或者你可以使用str.zfill方法這樣

print "A" + str(1).zfill(5) # A00001 
print "A" + str(100).zfill(5) # A00100 
0
def running_ids(start, end): 
    t = start[0] 
    low = int(start[1:]) 
    high = int(end[1:]) + 1 
    res = [] 
    for x in range(low, high): 
     res.append(t + '{0:05d}'.format(x)) 
    return res 

print(running_ids('A00001', 'A00005')) 
相關問題