Генерация строк из заданных символов и заданной начальной комбинацией
Нужно сгенерировать строки заданной длины из заданного алфавита.
С обычным декартовым произведением проблем нет, itertools.product() прекрасно работает. Но вот как начать генерацию с заданной комбинации?
import itertools
symbols = 'abcdfghijk'
length = 5
start_string = 'dfgkj' # Строка, с которой нужно начать
# Последовательная генерация всех вариантов
for line in itertools.product(symbols, repeat=length):
print(*line, sep='')
UPD: длина алфавита и длина генерируемых строк может быть больше
Ответы (2 шт):
Автор решения: Danis
→ Ссылка
можно так, но я уверен есть способ лучше
import itertools
symbols = 'abcdfghijk'
length = 5
start_string = 'dfgkj' # Строка, с которой нужно начать
# Последовательная генерация всех вариантов
lst = list(itertools.product(symbols, repeat=length))
for line in lst[lst.index(tuple(start_string)):]:
print(*line, sep='')
Автор решения: mkkik
→ Ссылка
Зная принцип обхода комбинаций, можно посчитать позицию для генератора. Дальше, применяя islice, смещаем генератор.
import itertools
def find_pos(symbols, fstr):
return sum(len(symbols) ** (len(fstr) - p) * symbols.index(s) for p, s in enumerate(fstr, 1))
symbols = 'abcdfghijk'
length = 5
start_string = 'dfgkj'
line_0 = ''
gen = itertools.product(symbols, repeat=length)
for line in itertools.islice(gen, find_pos(symbols, start_string), len(symbols) ** length):
# print(*line, sep='')
if not line_0:
line_0 = ''.join(line)
assert(start_string == line_0)
print(line_0, ''.join(line)) # -> dfgkj kkkkk
P.S. Вывод каждой строки закомментировал, т.к. большой объем. Для проверки запоминаю первую строку, вывожу вместе с последней.