Сформировать все возможные комбинации 2 характера потенциальной строки 8 символов?

Обновить

December 2018

Просмотры

165 раз

4

У меня есть, чтобы генерировать все возможные комбинации кортеж кортежей

( (base1 , position1) , (base2 , position2) )

bases = ["U", "C", "A", "G"]И positions = [0,1,2,3,4,5,6,7,8].

Требования

  • нет повторов
  • основы могут быть одинаковыми, но позиции должны быть разными
  • порядок должен быть сохранен.

Например:

( (A,1), (B,2) ) == ( (B,2) , (A,1) )и ( (A,1), (B,1) )должен быть отброшен.

Пример вывода:

[ ( (U,0) , (U,1) ), ( (U,0) , (U,2) ), ( (U,0) , (U,3) ) ...]

Должен иметь длину 448


Пример:

Для длины строки 2:

((U,0),(U,1))
((U,0),(C,1))
((U,0),(A,1))
((U,0),(G,1))

((C,0),(U,1))
((C,0),(C,1))
((C,0),(A,1))
((C,0),(G,1))

((A,0),(U,1))
((A,0),(C,1))
((A,0),(A,1))
((A,0),(G,1))

((G,0),(U,1))
((G,0),(C,1))
((G,0),(A,1))
((G,0),(G,1))

будет все комбинации ... Я думаю,


У меня это до сих пор

all_possible = []
nucleotides = ["U","C","A","G"]


for i in range(len(nucleotides)):
    for j in range(8):
        all_possible.append(((nucleotides[i],j),(nucleotides[i],j)))

1 ответы

5

Это звучит, как вы хотите, декартово произведение (все возможные 2-щелочное слово) X (каждый 2-комбинации нарисованный из диапазона (8)).

Вы можете получить это в общем виде

from itertools import product, combinations

def build(num_chars, length):
    bases = ["U", "C", "A", "G"]
    for letters in product(bases, repeat=num_chars):
        for positions in combinations(range(length), num_chars):
            yield list(zip(letters, positions))

что дает нам

In [4]: output = list(build(2, 8))

In [5]: len(output)
Out[5]: 448

In [6]: output[:4]
Out[6]: 
[[('U', 0), ('U', 1)],
 [('U', 0), ('U', 2)],
 [('U', 0), ('U', 3)],
 [('U', 0), ('U', 4)]]

In [7]: output[-4:]
Out[7]: 
[[('G', 4), ('G', 7)],
 [('G', 5), ('G', 6)],
 [('G', 5), ('G', 7)],
 [('G', 6), ('G', 7)]]
DSM

Связанные вопросы