2017-06-21 5 views
0

Je suis un nouveau membre de cette communauté et un nouvel utilisateur de Python.combiner des éléments de la matrice en groupes de 4 sans répétition

Je suis confrontée à un petit problème, tant au niveau conceptuel qu'au niveau du codage. C'est le suivant:

J'ai 11 groupes des 8 éléments identiques (dans la vraie vie ils sont 2 tampons de coton coupés en 4 morceaux chacun, pour un nombre total de 8 morceaux, multiplié par 11 donneurs - c'est un corps étude de la collecte des odeurs), à savoir:

AAAAAAAA BBBBBBBB CCCCCCCC ... MMMMMMMM

Je dois maintenant former un tampon supra-donneur en combinant 4 pièces différentes donateurs, par exemple ABCD, ABCE, CDEF etc ... Les nouveaux groupes de 4 éléments ne doivent pas contenir de pièces provenant du même donneur (par exemple, AABC ou ABDD ne sont pas autorisés) et bien sûr si une pièce est utilisée, alors elle ne peut pas être utilisée pour former un autre tampon supra-donneur. Je voulais coder quelque chose qui permettait la formation automatique des groupes, sans me casser la tête pour le faire manuellement, risquant de perdre le compte.

Est-ce un cas de combinaisons sans répétitions? Je pensais à faire quelque chose comme: créer une matrice comme celle ci-dessus, créer 20 (le nombre de blocs supra-donneur dont j'ai besoin) 4-éléments vides groupes (listes?) Puis une boucle dans laquelle je dis de choisir au hasard l'élément Cij de la matrice et déplacez-le dans la liste vide, puis passez à l'élément suivant à sélectionner, mais assurez-vous qu'il s'agit d'un type différent et d'un élément qui n'a pas été sélectionné dans un groupe précédent (par ex. élément C43, alors ce même élément ne devrait pas être utilisé dans un autre groupe). Faites-le jusqu'à ce que le groupe de 4 éléments soit complet, puis passez au groupe de 4 éléments suivant.

Je demande de l'aide parce que j'ai peu de temps pour le faire, sinon j'essaierais d'apprendre en faisant beaucoup d'erreurs. Une suggestion?

EDIT: exemple d'une table avec les groupes 4-éléments déjà créés et le nombre de pièces huitième partie utilisée pour les différents éléments utilisés (certains d'entre eux sera à l'avance, bien sûr)

supra-donor pads

Merci d'avance à tous ceux qui veulent donner leur avis!

+1

Je pense que les builtins itertools pourraient être assez –

+0

Salut @JackEvans, merci pour la réponse rapide. J'ai joint une image des résultats finaux, si cela peut répondre à votre question.merci encore –

+0

Avez-vous des exigences de choisir à peu près autant de chaque groupe? – JohanL

Répondre

0

Voici une solution qui génère toutes les combinaisons possibles des donneurs, puis les mélange et en choisit une nouvelle à chaque itération. Si la cueillette n'est pas valide, parce que tous les échantillons du donneur choisi sont déjà épuisés, cette combinaison est abandonnée et une nouvelle est choisie.

import itertools 
import random 

def comb_generator(bases, per_base, sought): 
    combs = list(itertools.combinations(bases, 4)) 
    random.shuffle(combs) 

    avail = {} 
    for base in bases: 
     avail[base] = per_base 

    comb_wanted = sought > 0 # Ensure picking at least one new comb 
    while comb_wanted: 
     comb = combs.pop() 
     comb_wanted = False 

     for base in comb: 
      comb_wanted = avail[base] <= 0 
      if comb_wanted: 
       break 

     if not comb_wanted: 
      for base in comb: 
       avail[base] -= 1 
      yield comb 
      sought -= 1 
      comb_wanted = sought > 0 

bases = 'ABCDEFGHIJKLM' 
per_base = 8 
sought = 20 

comb_gens = comb_generator(bases, per_base, sought) 

for i, comb in enumerate(comb_gens): 
    print('{:2}: {}'.format(i, comb)) 

Comme on peut le voir, je l'ai mis en œuvre la solution comme un générateur, car je trouve cela assez utile quand plus tard à travailler avec les entrées.

N.B. La solution actuelle ne se soucie pas de garder un nombre égal d'échantillons de chaque donneur. Cela pourrait être fait en ajoutant une exigence sur la disponibilité des différents donateurs pour ne pas trop varier. Mais cela ajouterait à la complexité, où les combinaisons rejetées sont réinsérées, à une position ultérieure dans le 'deck'. Pourriez-vous donner un exemple de quelques exemples d'intrants et de résultats escomptés?

+0

C'est génial. Merci beaucoup! –