Вы можете использовать itertools.product
для этого, если вы zip
две строки вместе (превращая их в набор из 2-х кортежей для product
, чтобы найти комбинации). Тогда вы, вероятно, захотите сделать их уникальными в наборе. Все вместе это выглядит так:
>>> {''.join(t) for t in product(*zip(Ref, Test))}
{'AAAAAAAAA', 'AAAAAATAA', 'AAAAAAATA', 'AAATAATTA', 'AAATAATAA', 'AAATAAAAA', 'AAATAAATA', 'AAAAAATTA'}
Чтобы разобрать это немного дальше, поскольку это выглядит как шум линии, если вы не знакомы с рассматриваемыми функциями ...
Вот zip
, который превращает наши две строки в итерацию пар (оборачивая их в понимание списка для простоты печати, но мы удалим это на следующем этапе):
>>> [t for t in zip(Ref, Test)]
[('A', 'A'), ('A', 'A'), ('A', 'A'), ('A', 'T'), ('A', 'A'), ('A', 'A'), ('A', 'T'), ('A', 'T'), ('A', 'A')]
Функция product
принимает в качестве аргументов произвольное количество итераций; мы хотим передать все наши два кортежа как отдельные аргументы, используя *
:
>>> [t for t in product(*zip(Ref, Test))]
[('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'), ('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'), ... (a whole lot of tuples)
Используйте join
, чтобы превратить эти кортежи обратно в строки:
>> [''.join(t) for t in product(*zip(Ref, Test))]
['AAAAAAAAA', 'AAAAAAAAA', 'AAAAAAATA', 'AAAAAAATA', ... (still a whole lot of strings)
И делая это понимание набора ({}
) вместо понимания списка ([]
), мы получаем только уникальные элементы.