7
votes

Combinaisons de bouclage Python de 8 objets en 3 groupes, 3-3-2

Disons que j'ai une liste de 8 objets, numéroté que 1-8.

Les objets sont placés dans trois cases, 3 en une boîte, 3 dans une autre boîte, 2 dans la dernière case. Par mathématiques, il y a 8C3 * 5C3 = 560 façons de le faire. Je veux boucler de 560 objets. Y a-t-il un moyen dans Python de le faire? P>

Le résultat doit ressembler à ceci: p> xxx pré>

Notez que ['12', ' 345 ',' 678 '] code> et [' 12 ',' 354 ', 876'] code> sont considérés comme les mêmes à cet effet. P>

Je veux faire une boucle de cette liste. Y a-t-il un moyen dans Python de le faire? P>

Voici la solution que je reçois, mais cela semble laid. P>

import itertools
for c1,c2 in itertools.combinations(range(8),2):
            l2=list(range(8))
            l2.pop(c2)
            l2.pop(c1)
            for c3,c4,c5 in itertools.combinations(l2,3):
                l3=l2[:]
                l3.remove(c5)
                l3.remove(c4)
                l3.remove(c3)
                c6,c7,c8=l3
                print(c1,c2,c3,c4,c5,c6,c7,c8)


4 commentaires

Comment as-tu essayé de le résoudre? quel code?


Vous pourriez iTerTools docs.python.org/2/library/itétools.html et ajoutez une partie de votre propre logique.


Je dois dire que je ne comprends pas vraiment votre question.


Alors, avez-vous résolu cela?


3 Réponses :


-1
votes

L serait une liste de huit objets, dans cet exemple des chaînes: xxx

produit: xxx


0 commentaires

2
votes
['12', '34']
['13', '24']
['14', '23']
['23', '14']
['24', '13']
['34', '12']

2 commentaires

Je reçois IndexError: indice de liste hors de portée lors de l'exécution du code.


Une bonne réponse, je ne comprends pas pourquoi ce n'est pas ce qui n'est pas avancé!



0
votes

Vous pouvez simplement perpercer toutes vos 8 valeurs (comme indiqué sur les réponses précédentes). Pour cela, utilisez ce Réponse précédente (aussi sur le code suivant).

Attribuez ensuite chaque combinaison en tant que tuple, elles peuvent donc être hachées et uniques, car elles devront leur commander, afin qu'ils puissent également être comparables de manière unique. P>

def all_perms(elements):
    if len(elements) <=1:
        yield elements
    else:
        for perm in all_perms(elements[1:]):
            for i in range(len(elements)):
                #nb elements[0:1] works in both string and list contexts
                yield perm[:i] + elements[0:1] + perm[i:]


v = [1,2,3,4,5,6,7,8]

a = {}
for i in all_perms(v):
    k = (tuple(sorted([i[0],i[1]])) , tuple(sorted([i[2],i[3],i[4]])) , tuple(sorted([i[5],i[6],i[7]])))

    if k not in a:
        a[k] = [str(i[0])+str(i[1]), str(i[2])+str(i[3])+str(i[4]), str(i[5])+str(i[6]) + str(i[7])]

x = 0
for i in a.values():
    print x, i
    x+=1


1 commentaires

il l'a supprimé pour une raison quelconque, c'est de retour dans la question maintenant