8
votes

Comment diviser une liste en sous-ensembles sans éléments répétés dans Python

J'ai besoin de code qui prend une liste (jusqu'à n = 31 ) et renvoie tous les sous-ensembles possibles de n = 3 sans deux éléments répétant dans le même sous-ensemble deux fois (Pensez aux personnes qui font équipe dans des groupes de 3 personnes avec de nouvelles personnes à chaque fois): xxx

et retourne xxx

mais pas: xxx

car 1 et 7 sont déjà apparus ensemble (de même, 3 et 9).

Je voudrais aussi faire cela pour des sous-ensembles de n = 2 . Merci !!


6 commentaires

"TOUT POSSIBLE" est en désaccord avec "est déjà apparu ensemble". Pourquoi choisissons-nous d'inclure [1,4,7] [2,3,8] [3,6,9] et donc exclure [1,5,7] [2, 4,8] [3,6,9] , plutôt que l'inverse?


Que devrait-il faire lorsque le total n'est pas un multiple de la taille du groupe? Traiter les extras comme un groupe plus petit? Tournez-les, mais ignorez ce qui se passe quand ils ne sont pas dans un groupe? Ou est-ce que cet ensemble de conditions n'est pas une entrée valide?


Merci pour les commentaires. Pour l'instant, supposons que n est un multiple de taille de groupe (n = 30, n = 3).


Merci pour les commentaires. @Thomas: Pour le moment, supposons n = 30, n = 3.


@Karl: Bon point ... Ce n'est pas un point que j'ai pensé à ... mais je choisis de manière aléatoire entre les options.


Est-ce vraiment divisé, donc pour n = 15, n = 3 il devrait renvoyer 5 groupes de 3 par ligne?


3 Réponses :


1
votes

Essayez ceci: xxx

sortie pour n = 10: http://pastebin.com/vm54hrq3


4 commentaires

L'avez-vous testé pour n = 15, n = 3?


@Fenikso, ça marche sacrément lent. J'avais assez de patience pour trouver une seule solution: Pastebin.com/te7xv0wt


@Fenikso, pourquoi 5? IIUC, op signifie "tous les sous-ensembles possibles de n = 3" pour n'importe quel N.


15 divisé par 3 est 5. C'est ce que je crois comprendre le problème.



1
votes

Voici ce que j'ai proposé:

~$ time python test_combos.py 
((1, 2, 3), (4, 5, 6), (7, 8, 9))
((1, 4, 7), (2, 5, 8), (3, 6, 9))
((1, 5, 9), (2, 6, 7), (3, 4, 8))
((1, 6, 8), (2, 4, 9), (3, 5, 7))

real        0m0.182s
user        0m0.164s
sys         0m0.012s


0 commentaires

1
votes

Voici ma tentative de solution assez générale à votre problème. xxx

Cependant, il est très lent pour les valeurs élevées de n , trop lent pour n = 31 . Je n'ai pas le temps maintenant d'essayer d'améliorer la vitesse, mais je pourrais essayer plus tard. Les suggestions sont les bienvenues!


0 commentaires