2013-04-09 102 views
1

我想在Python中創建一個字母數字序號字母數字序列號,該序列號由以下規則進行:的Python:有一些規則

3位數字系列 允許值1-9(零被排除在外)和AZ(排除I和O的所有首都) 代碼應該能夠在得到輸入號碼後給出下一個號碼。

例如:如果輸入數字11D,那麼輸出數字應該是11E,如果輸入數字是119,則輸出應該是12A而不是120.請讓我知道這個描述是否足以解釋我的要求。我目前使用的代碼

提到如下:

def next_string(self, s): 
    strip_zs = s.rstrip('z') 
    if strip_zs: 
     return strip_zs[:-1] + chr(ord(strip_zs[-1]) + 1) + 'a' * (len(s) - len(strip_zs)) 
    else: 
     return 'a' * (len(s) + 1) 
+1

您實際上需要基礎轉換。我們有很多關於此的話題,例如http://stackoverflow.com/q/2267362/989121 – georg 2013-04-09 14:58:23

+1

爲什麼119後面是12A而不是11A?它增加了1-2-3 -...- 8-9-A-B -...- Y-Z? – 2013-04-09 15:09:24

+0

@JoeFrambach:對不起,我的意思是119後跟11A – Addy 2013-04-09 15:23:20

回答

0

您可以使用遞歸此任務:

def next_string(s): 
    if len(s) == 0: 
     return '1' 
    head = s[0:-1] 
    tail = s[-1] 
    if tail == 'Z': 
     return next_string(head) + '1' 
    if tail == '9': 
     return head+'A' 
    if tail == 'H': 
     return head+'J' 
    if tail == 'N': 
     return head+'P' 
    return head + chr(ord(tail)+1) 

這可能不是最Python的代碼,但是這顯示瞭如何考慮一下。

>>> next_string('11A') 
'11B' 
>>> next_string('11A') 
'11B' 
>>> next_string('11Z') 
'121' 
>>> next_string('119') 
'11A' 
>>> next_string('1') 
'2' 
>>> next_string('ZZ') 
'111' 
>>> next_string('ZZ1') 
'ZZ2' 
>>> next_string('ZZ9') 
'ZZA' 
>>> next_string('ZZH') 
'ZZJ' 
+1

嗯 - 爲什麼一個「**需要** *使用遞歸*」呢? – 2013-04-09 15:24:44

+0

好的我會把它改成** can **。這樣對我來說,圍繞它就更容易了。 – 2013-04-09 15:26:42

+0

謝謝@JoeFrambach:關於如何停止在ZZZ執行代碼,目前輸出是1111,而我希望代碼此時退出。 – Addy 2013-04-09 18:32:19