Другая возможность состоит в том, чтобы создать список комбинаций последовательности, которые следуют правилам желаемой последовательности, и отфильтровать конечный результат так, чтобы все оставшиеся последовательности существовали во входной последовательности:
seq = 'G**ATG**ATCG**ATG**C**TGA**CGTA**TAG**GT**TAA**C'
def new_data(f):
def wrapper():
full = map('**'.join, f(seq.split('**')))
return list(filter(lambda x:x in seq, full)))
return wrapper
@new_data
def outer(data):
def combinations(d, current = []):
if current and current[0] == 'ATG' and current[-1] in ['TAA', 'TGA', 'TAG']:
yield current
else:
for i in d:
if i in ['TAA', 'TGA', 'TAG'] and current:
yield current + [i]
else:
if not current and i == 'ATG':
yield from combinations(d, [i]+current)
elif current and current.count(i) < seq.split('**').count(i):
yield from combinations(d, current+[i])
return list(combinations(data))
results = list(map(lambda x:'**'+x+'**', outer()))
Выход:
['**ATG**ATCG**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**C**TGA**', '**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**ATCG**ATG**C**TGA**', '**ATG**C**TGA**', '**ATG**C**TGA**']
Изменить: относительно вашего недавнего изменения формата данных, вы можете создать функцию для поиска общих группировок:
def combinations():
groupings = {'G', 'ATG', 'ATCG', 'ATG', 'C', 'TGA', 'CGTA', 'TAG', 'GT', 'TAA', 'C'}
seq = 'GATGATCGATGCTGACGTATAGGTTAAC'
while seq:
possibilities = [i for i in groupings if seq.startswith(i)]
seq = seq[len(max(possibilities, key=len)):]
yield max(possibilities, key=len)
seq = '**'.join(combinations())
results = list(map(lambda x:'**'+x+'**', outer()))