2010-07-17 2 views
0

J'ai un groupe de seaux, chacun avec un certain nombre d'éléments en eux. Je veux faire des combinaisons avec un objet de chaque seau. La boucle devrait continuer à faire des combinaisons différentes jusqu'à ce que chaque élément ait participé à au moins un certain nombre défini.boucle jusqu'à ce que tous les éléments ont été accédés N fois en python

Je peux facilement voir comment exécuter la boucle et arrêter une fois qu'un seul élément a été accédé un certain nombre de fois. Cependant, je ne vois pas comment définir un point de coupure minimum au-delà de la recherche de tous les éléments dans tous les compartiments pour vérifier leur numéro d'accès après chaque itération de la boucle.

+3

Cela ressemble à un problème de devoirs, non? – cape1232

Répondre

1

itertools.product est une façon (une très systématique) de faire les « combinaisons » vous demandez (ne pas confondre avec la fonction .combinations bien sûr) - ou vous pouvez les faire au hasard avec random.choose de chaque seau; Je ne sais pas lequel est pour vous puisque je ne sais pas quel est votre but réel. Quoi qu'il en soit, je garderais une trace du nombre de combos de chaque objet avec un dict (ou un dict par godet, s'il peut y avoir un chevauchement dans les items entre les buckets). Ou, vous pouvez utiliser un collections.Counter en Python 2.7, si c'est votre version. Quoi qu'il en soit, une possibilité de faire ce que vous demandez est: au moment où le nombre d'un objet atteint N, retirez cet objet de son seau (ou tous les seaux, s'il y a chevauchement et c'est la sémantique requise) - sauf que si cela laisse le seau vide, restaurez le contenu du seau et marquez ce qui est «fini» (vous n'avez pas besoin de retirer des articles d'un seau fait) en ajoutant l'index du bucket à un ensemble.

Vous avez terminé lorsque tous les compartiments sont effectués (que ce soit de manière aléatoire ou systématique).

Besoin d'un code pour expliquer cela mieux? Veuillez alors spécifier la sémantique de chevauchement (si le chevauchement est possible) et les exigences systématiques ou aléatoires que vous avez.

+0

Il n'y a pas de chevauchement entre les godets de sorte que le random.choose pour choisir un article fonctionne très bien. Un dictionnaire utilisant les éléments comme des clés et des heures accédées en tant que valeurs semble être bien. @Vicki Laidler Puis vérifie avec min (dictionary.values ​​())

+0

@Fred, bien sûr, si vous êtes après des échantillons aléatoires, cela vérifie (avec un 'collections.Counter' dans 2.7, un' collections.defaultdict (int) 'dans la plupart des versions, un' dict' nu seulement si vous insistez; -) est celui qui permettra le mieux de préserver un caractère aléatoire impartial. –

0

essayer

visits = defaultdict(int) 

# do at each node visiting 
    visits[n] += 1 
    if visits[n] >= MAX_VISITS: 
     break 

print 'done' 
+0

Cela ne fait * pas * * de * voir * chaque article être visité un certain nombre de fois, comme le demande le PO - il se ferme dès qu'un ** un ** article a été visité autant de fois, comme l'OP l'a déjà dit sait comment faire! –

+0

Il semble que j'ai mal lu cette ligne.Ignorer la réponse – sharvey

0

Utilisez un dictionnaire avec les éléments que les clés. Chaque fois que l'article est utilisé, mettez à jour son compte. Vérifiez ensuite si toutes les valeurs sont au moins au-dessus du seuil, à savoir:

counter = dict() 
while min(counter.values) < threshold: 
    # make a combination 
    # and update the dictionary 
0

En Python vanille, cela semble faire le travail:

buckets = [ [1,2,3],[4],[5,6],[7,8,9,0] ] 

def combo(b, i = 0, pref = []): 
    if len(b) > i: 
    c = b[i] 
    for v in c: 
     combo(b, i + 1, pref + [v]) 
    else: 
    print pref 

combo(buckets) 

Sortie:

[1, 4, 5, 7] 
[1, 4, 5, 8] 
[1, 4, 5, 9] 
[1, 4, 5, 0] 
[1, 4, 6, 7] 
[1, 4, 6, 8] 
[1, 4, 6, 9] 
[1, 4, 6, 0] 
[2, 4, 5, 7] 
[2, 4, 5, 8] 
[2, 4, 5, 9] 
[2, 4, 5, 0] 
[2, 4, 6, 7] 
[2, 4, 6, 8] 
[2, 4, 6, 9] 
[2, 4, 6, 0] 
[3, 4, 5, 7] 
[3, 4, 5, 8] 
[3, 4, 5, 9] 
[3, 4, 5, 0] 
[3, 4, 6, 7] 
[3, 4, 6, 8] 
[3, 4, 6, 9] 
[3, 4, 6, 0] 

Il n'y a aucun doute une façon plus pythonienne de le faire.

Questions connexes