2017-02-04 1 views
2

Voici les sorties de code:Comment utiliser itertools pour un produit utilisant une valeur d'index spécifique?

import itertools as it 
list(it.product(['A', 'T'], ['T', 'G'])) 
Out[230]: [('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')] 

Mais, si la liste est la suivante:

['A', '/', 'T'], ['T', '/', 'G'] 
['C', '|', 'T'], ['A', '|', 'C'] 

Je veux

[('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')] 
[('C', 'A'), ('T', 'C')] 

qui signifie:

list(it.product(['A', '/', 'T'], ['T', '/', 'G'])) if '/' in the list 
else list(it.product(['A', '/', 'T'], ['T', '/', 'G'])) if '|' in the list 

Comment puis-je ge t le même résultat sans enlever / et | parce que c'est une condition.

Je pense en utilisant l'indice pourrait fonctionner et a essayé quelque chose comme:

list(it.product(['A', '/', 'T'], ['T', '/', 'G']).index([0,2)) 

et plusieurs autres processus, mais n'a pas aidé.

Ce code est la queue d'un gros code, donc je n'essaie pas de créer une fonction ou de supprimer /.

Répondre

2

Vous pouvez appliquer une filter:

>>> from itertools import product 

>>> list(filter(lambda x: '/' not in x, product(['A', '/', 'T'], ['T', '/', 'G']))) 
[('A', 'T'), ('A', 'G'), ('T', 'T'), ('T', 'G')] 

ou les exclure à l'avance (cette fois j'utilise l'équivalent du filter: une compréhension conditionnelle):

a = ['A', '/', 'T'] 
b = ['T', '/', 'G'] 

list(product([item for item in a if item != '/'], 
      [item for item in b if item != '/'])) 

Notez que vous peut également faire des filtres avec des indices lorsque vous le combinez avec enumerate:

list(product([item for idx, item in enumerate(a) if idx != 1], 
      [item for idx, item in enumerate(b) if idx != 1])) 

ou si vous avez des conditions simples aux indices puis trancher la liste est aussi une option:

>>> list(product(a[:2], b[:2])) 
[('A', 'T'), ('A', '/'), ('/', 'T'), ('/', '/')] 
+0

Je mis à jour l'état un peu. Pouvez-vous s'il vous plaît regarder le problème à nouveau. – everestial007

+0

Pourriez-vous préciser quelles sont les conditions réelles? J'ai eu l'impression de comprendre ce que vous vouliez dire - mais vu votre nouvel exemple ('['C', '|', 'T'], ['A', '|', 'C']'): quels sont les règles là-bas? – MSeifert

+0

s'il y a '|' dans la liste, créez uniquement le produit des valeurs du même niveau d'index. ** c'est-à-dire ** '0 avec 0 et 2 avec 2 - ce qui me donne ['C', 'A'], ['T', 'C']' – everestial007