Генерировать все комбинации нуклеотидных k-мер между диапазонами (i, j)


Мне нужно сгенерировать список всех возможных комбинаций нуклеотидов длиной от 5 до 15.

nucleotides = ['A', 'T', 'G', 'C']

Ожидаемые результаты:

AAAAA
AAAAT
AAAAC
AAAAG
AAATA
AAATT
...
AAAAAAAAAAAAAAA
AAAAAAAAAAAAAAT
etc.

Я попробовал:

for i in range(5,16):
    for j in itertools.permutations(nucleotides, i):
        print j
Но это не работает, если len(nucleotides) < i.

Заранее спасибо!

3 4

3 ответа:

Если вы хотите найти все комбинации, вы должны использовать .product() как .permutations() не будет производить повторяющиеся нуклеотиды, такие как AAAAA или AATGC в любом случае. Попробуйте это:

for i in range(5, 16):
    combinations = itertools.product(*itertools.repeat(nucleotides, i))
    for j in combinations:
        print(j)

Update: как упоминал @JaredGoguen, аргумент repeat также может быть использован здесь:

combinations = itertools.product(nucleotides, repeat=i)

Чтобы дополнить ответ Сельчука, вот один лайнер, который производит итерацию.

from itertools import chain, product

chain(product(nucleotides, repeat=i) for i in range(5, 16))

Другой способ генерации-использование combinations_with_replacement(), который позволяет повторять:

import itertools

result=set()
nucleotides = ['A', 'T', 'G', 'C']
for i in range(5,16):
    for j in itertools.combinations_with_replacement(nucleotides, i):
        print(''.join(j))

Затем вы можете переставить их дальше, чтобы получить все вариации следующим образом:

import itertools

result=set()
nucleotides = ['A', 'T', 'G', 'C']
for i in range(5,16):
    for j in itertools.combinations_with_replacement(nucleotides, i):
        for k in itertools.permutations(j):
            result.add(''.join(k))
for i in result:
    print(i)