2013-04-09 45 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