Devo generare tutti i possibili accoppiamenti, ma con il vincolo che un particolare accoppiamento si verifica solo una volta nei risultati. Ad esempio:Generazione di tutte le permutazioni di coppie univoche
import itertools
for perm in itertools.permutations(range(9)):
print zip(perm[::2], perm[1::2])
genera tutte le possibili permutazioni bipartite; ecco un piccolo sottoinsieme di uscita:
...
[(8, 4), (7, 6), (5, 3), (0, 2)]
[(8, 4), (7, 6), (5, 3), (1, 0)]
[(8, 4), (7, 6), (5, 3), (1, 2)]
[(8, 4), (7, 6), (5, 3), (2, 0)]
[(8, 4), (7, 6), (5, 3), (2, 1)]
[(8, 5), (0, 1), (2, 3), (4, 6)]
[(8, 5), (0, 1), (2, 3), (4, 7)]
[(8, 5), (0, 1), (2, 3), (6, 4)]
[(8, 5), (0, 1), (2, 3), (6, 7)]
[(8, 5), (0, 1), (2, 3), (7, 4)]
[(8, 5), (0, 1), (2, 3), (7, 6)]
[(8, 5), (0, 1), (2, 4), (3, 6)]
[(8, 5), (0, 1), (2, 4), (3, 7)]
[(8, 5), (0, 1), (2, 4), (6, 3)]
...
Come faccio a filtrare ulteriormente in modo che io vedo sempre e solo (8,4) una volta (durante tutte le permutazioni filtrati), e (8,5) solo una volta e (0,1) solo una volta e (4,7) una sola volta, ecc.?
Fondamentalmente voglio le permutazioni in modo che ogni accoppiamento di due elementi avvenga solo una volta.
Scommetto che c'è un itertoolo aggiuntivo che risolverebbe questo problema ma non sono abbastanza esperto per sapere di cosa si tratta.
Aggiornamento: Gareth Rees è corretto - ero completamente all'oscuro del fatto che stavo cercando di risolvere il problema del round robin. Ho un ulteriore vincolo che è quello che sto facendo è raggruppare le persone per esercizi di programmazione della coppia. Quindi, se ho un numero dispari di persone, ho bisogno di creare un gruppo di tre persone per includere una persona strana per ogni esercizio. Il mio attuale pensiero è quello di (1) creare un numero pari di persone aggiungendo una persona invisibile. Quindi, dopo l'abbinamento, trova la persona accoppiata con la persona invisibile e inseriscile casualmente in un gruppo esistente per formare una squadra di tre. Tuttavia, mi chiedo se non ci sia già un algoritmo o un adeguamento al round-robin che lo faccia in un modo migliore.
Aggiornamento 2: La soluzione di Theodros produce esattamente il risultato giusto senza l'inutile futore su quanto descritto sopra. Tutti sono stati incredibilmente utili.
Che cosa intendi esattamente per abbinamento? Per una permutazione? [(0, 1), (2, 3), (4, 5), (6, 7)] normalmente non si chiamerebbe né una permutazione né un abbinamento di [0, 1, 2, 3, ..., 8 ]. –
Ho aggiornato la mia risposta per tenere conto del vostro aggiornamento. –