как сгенерировать последовательность строк в python между заданной начальной и конечной точкой

#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 различных перестановок.