#python #string #sequence
Вопрос:
Я хочу ввести, например, в качестве начального ввода 22Ef
и FFFF
в качестве конечного ввода, и я хочу напечатать всю строку между этими 2 входами, вывод должен быть таким
22Ef
22EA
22EB
.
.
.
FFFE
FFFF
и это моя строка, которую я хочу выбрать.
0123456789abcdefABCDEF
Комментарии:
1. Итак, вы хотите перечислить диапазон чисел в базе 22, закодированных нестандартным способом?
2. ДА…………
Ответ №1:
Это решение позволяет избежать прохождения всех комбинаций от 0000 до вашего начального ввода:
start = '22Ef'
end = 'FFFF'
characterset = '0123456789abcdefABCDEF'
base = len(characterset)
baseNnumber = [] # little endian list of integers each representing a digit
# find base N representation of start
exponent = 0
startval = 0
for i in start[::-1]:
digit = characterset.index(i)
baseNnumber.append(digit)
startval = digit * base**exponent
exponent = 1
baseNnumber.extend([0]*(len(end)-len(start)))
# find representation of end
exponent = 0
endval = 0
for i in end[::-1]:
digit = characterset.index(i)
endval = digit * base**exponent
exponent = 1
# number of times to print
increments = endval - startval 1
for i in range(increments):
index = 0
outstr = ''
# remove leading zeros
notzero = False
for i in baseNnumber[::-1]:
notzero = notzero | (i != 0)
# add new character to string
outstr = characterset[i] * notzero
# the actual printing
print(outstr)
# increment baseNnumber by 1
while True:
baseNnumber[index] = 1
if baseNnumber[index] == base:
baseNnumber[index] = 0
index = 1
else:
break
Если вы хотите включить начальные нули, вы можете заменить строки 34-38 на это, поскольку notzero
это предназначено для их удаления:
for i in baseNnumber[::-1]:
outstr = characterset[i]
Или, если вы уверены, что начальный и конечный входы одинаковы, просто удалите строку 17 и замените ее выше, поскольку она предназначена для решения проблемы, когда начальный и конечный входы имеют разную длину.
Комментарии:
1. Большое вам спасибо, действительно полезно
Ответ №2:
Следующее (с использованием product
функции from itertools
) должно работать:
from itertools import product
strings = []
start = "22Ef"
end = "FFFF"
include = False
for i in product("0123456789abcdefABCDEF", repeat=4):
curstring = "".join(i)
if curstring == start:
include = True
if curstring == end:
strings.append(curstring)
break
if include:
strings.append(curstring)
print(strings)
Комментарии:
1. Есть ли какой-нибудь способ работать с большим диапазоном, так как у меня есть ввод с диапазоном 64 символа? и спасибо
2. Вы имеете в виду, что как начальное, так и конечное значение может содержать 64 символа? В этом случае я думаю, что другой ответ может сработать, но для его вычисления потребуется очень, очень много времени.
3. Например, если вы хотите найти все комбинации между начальной строкой 64 «2»и конечной строкой 64 «3», существует около 3.9e84 различных перестановок.