2017-03-30 1 views
4

J'ai un pour générer toutes les combinaisons possibles d'un tuple de tuplesGénérer toutes les combinaisons de 2 caractères possibles d'une chaîne de 8 caractères potentiels?

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

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

Exigences

  • ne répète
  • les bases peuvent être les mêmes, mais les positions doivent être différents
  • l'ordre doit être maintenu.

Par exemple:

((A,1), (B,2)) == ((B,2) , (A,1)) et ((A,1), (B,1)) devrait être mis au rebut.

sortie de l'échantillon:

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

devrait avoir une longueur de 448


Exemple:

Pour une longueur de chaîne de 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)) 

aurait toutes les combinaisons ... Je pense que


J'ai ce jusqu'à

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))) 
+5

Pouvez-vous clarifier le problème? À quoi la sortie ressemble-t-elle spécifiquement? Je ne suis pas certain de ce que votre exemple est même supposé illustrer. –

+3

Je ne suis pas sûr de ce que vous demandez exactement^mais 'itertools' aura certainement quelque chose qui vous aidera avec ceci: https://docs.python.org/3/library/itertools.html – Jack

+0

En utilisant les' bases 'et' positions' listes que vous donnez, 'len ([((b1, p1), (b2, p2)) pour (b1, b2) dans le produit (bases, bases) pour (p1, p2) dans les combinaisons (positions, 2)]) 'aboutit à 576, pas à 448. Je pense que votre liste' positions' est trop longue. – bli

Répondre

5

On dirait que vous voulez que le produit cartésien (chaque mot possible 2-base) X (tous les Combinaison de 2 tirée de la gamme (8)).

Vous pouvez obtenir ce en général par

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)) 

qui nous donne

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)]]