您不能直接在多个字符使用ord()
,它会出错误与错误 -
TypeError: ord() expected a character, but string of length 2 found
而且,这将是非常复杂与for
环和range()
要做到这一点,我会建议使用while
循环并检查,直到开始字符变成结束字符。
做到这一点的一种方法是获取最后一个元素,检查它的Z
是否将其更改为A
并在其之前增加元素。否则将其ord()
增量1
,然后使用chr()
获取该字符。
例算法上字符的任意大小的作品 -
def resolve(item):
start = int(re.search(r'\d+', item[0]).group())
c = re.search(r'[a-zA-Z]+', item[0]).group()
d = re.search(r'[a-zA-Z]+', item[1]).group()
print(c, d)
s = c
yield s + str(start)
while s != d:
ls = len(s) - 1
news = ""
for i in range(ls,-1,-1):
c = s[i]
if c.upper() == 'Z':
news += 'A'
else:
news += chr(ord(c) + 1)
break
s = s[:i] + news[::-1]
yield s + str(start)
示例/演示 -
>>> def resolve(item):
... start = int(re.search(r'\d+', item[0]).group())
... c = re.search(r'[a-zA-Z]+', item[0]).group()
... d = re.search(r'[a-zA-Z]+', item[1]).group()
... print(c, d)
... s = c
... yield s + str(start)
... while s != d:
... ls = len(s) - 1
... news = ""
... for i in range(ls,-1,-1):
... c = s[i]
... if c.upper() == 'Z':
... news += 'A'
... else:
... news += chr(ord(c) + 1)
... break
... s = s[:i] + news[::-1]
... yield s + str(start)
...
>>>
>>> xx = resolve(['AX95', 'BD95'])
>>>
>>> print(list(xx))
AX BD
['AX95', 'AY95', 'AZ95', 'BA95', 'BB95', 'BC95', 'BD95']
拆分这个分解成更小的问题,而不是试图解决它的所有功能于一体;一方面,您在当前代码中有不必要的重复。 – jonrsharpe
你的意思是只扩展左边两位'[A-Z]'指定的? – luoluo
是的。指定开始和结束范围。 – PyAn