Генерация строк из заданных символов и заданной начальной комбинацией

Нужно сгенерировать строки заданной длины из заданного алфавита. С обычным декартовым произведением проблем нет, 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. Вывод каждой строки закомментировал, т.к. большой объем. Для проверки запоминаю первую строку, вывожу вместе с последней.

→ Ссылка