Вы не можете напрямую использовать 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)
Пример/Demo -
>>> 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