-1
votes

Comment filtrer des éléments de produit cartésien après des conditions de commande spécifiques

Je dois générer plusieurs réactions avec différentes variables. Ils ont 3 éléments. Appelons-les B code>, s code> et h code>. Et ils commencent tous avec b1 code>. s code> peut être ajouté à l'élément s'il y a au moins un B code>. Donc, il peut être b1s1 code> ou b2s2 code> ou b2s1 code> etc ... mais pas b1s2 code>. Il en va de même pour h code>. b1s1h1 code> ou b2s2h1 code> ou b4s1h1 code> mais jamais b2s2h3 code>. La variation finale serait b5s5h5 code>. J'ai essayé avec itheroTools.Product code>. Mais je ne sais pas comment vous débarrasser des éléments qui ne correspondent pas à mon état et comment ajouter l'élément suivant. Voici mon code:

import itertools

a = list(itertools.product([1, 2, 3, 4], repeat=4))

#print (a)

met = open('random_dat.dat', 'w')
met.write('Reactions')
met.write('\n')
for i in range(1,256): 
    met.write('\n')
    met.write('%s: B%sS%sH%s -> B%sS%sH%s' %(i, a[i][3], a[i][2], a[i][1], a[i][3], a[i][2], a[i][1]))
    met.write('\n')
met.close()


2 commentaires

Puis divisez les lettres et les chiffres, stockez les numéros dans la liste et assurez-vous que la liste est décroissante. Si ce n'est pas le cas, supprimez l'exemple


Ce n'est pas vraiment grand, alors pourquoi ne pas utiliser 3 boucles imbriquées simples?


3 Réponses :


4
votes

simple pour les boucles fera ce que vous voulez: xxx

sortie: xxx


merci à @mikuszefski pour souligner des améliorations.


4 commentaires

Pourquoi pas pour s dans la plage (b) ?


Je pense que c'est h> s. Mais il n'a pas donné d'exemple explicite.


@MIK Bonne suggestion, mais du Plage de la limite supérieure exclusive S repontiquée (1, B + 1)


Bien sûr, et comme B5 est autorisé, la plage devrait aller à 6



0
votes

Patrick Sa réponse dans le style de compréhension de la liste xxx

donne xxx


0 commentaires

0
votes

Je voudrais implémenteriez votre "Utilisation iTERTOOLS.PRODUCT CODE> et supprimez les éléments inutiles" Solution de la solution suivante: xxx pré>

Notez que j'ai supposé que les derniers éléments doivent être plus petit ou égal que n'importe quel autre. Notez que A code> est maintenant code> de 35 tuple code> s chacun 3 int code> s. Donc, vous devez effectuer STR code> S d'eux par exemple à l'aide de la soi-disant f-chaîne: p> xxx pré>

sortie: p>

['B1S1H1', 'B2S1H1', 'B2S2H1', 'B2S2H2', 'B3S1H1', 'B3S2H1', 'B3S2H2', 'B3S3H1', 'B3S3H2', 'B3S3H3', 'B4S1H1', 'B4S2H1', 'B4S2H2', 'B4S3H1', 'B4S3H2', 'B4S3H3', 'B4S4H1', 'B4S4H2', 'B4S4H3', 'B4S4H4', 'B5S1H1', 'B5S2H1', 'B5S2H2', 'B5S3H1', 'B5S3H2', 'B5S3H3', 'B5S4H1', 'B5S4H2', 'B5S4H3', 'B5S4H4', 'B5S5H1', 'B5S5H2', 'B5S5H3', 'B5S5H4', 'B5S5H5']


0 commentaires