Selon le titre, j'essaie d'écrire une fonction qui renvoie une liste de tuples d'ensembles de longueur p, où chaque ensemble est une partition de l'ensemble S. e.g. equipartitions ({0,1,2,3}, 2) -> [({0, 1}, {2, 3}), ({0, 2}, {1, 3}), ({0, 3}, {1, 2})]. Cependant, j'ai quelques difficultés à le faire fonctionner correctement pour d'autres cas puisque itertools.products
ne concaténera pas les tuples d'ensembles. Tout conseil ou aide sur la façon d'écrire ou de corriger la fonction serait grandement apprécié. Voici ma tentative jusqu'ici:Création de partitions d'ensembles de telle sorte que chaque partition ait la même longueur
equipartitions_cache_d = {}
def equipartitions(S,p):
global equipartitions_cache_d
if len(S) % p != 0:
raise ValueError("Set must be of a length which is a multiple of p")
if equipartitions_cache_d.get((frozenset(S),p)):
return equipartitions_cache_d[(frozenset(S),p)]
else:
if len(S) == p:
equipartitions_cache_d[(frozenset(S),p)] = [S]
else:
gens = []
combs = [set(s) for s in itertools.combinations(S, p)]
for c in combs:
gens += [s for s in itertools.product([c], equipartitions(S-c,p))]
uniqgens = []
for g in gens:
if not any([all([x in q for x in g]) for q in uniqgens]):
uniqgens.append(g)
equipartitions_cache_d[(frozenset(S),p)] = uniqgens
return equipartitions_cache_d[(frozenset(S),p)]
Mathématiquement, ne correspond pas, ne devrait pas y avoir 15 tuples dans la sortie pour Equipart ({1,2,3,4,5,6}, 2)? (https://math.stackexchange.com/questions/1058972/double-factorial-number-of-possibilities-to-partition-a-set-of-2n-items-into) Ce sont: 12 34 56; 12 35 46; 12 36 45; 13 24 56; 13 25 46; 13 26 45; 14 23 56; 14 25 36; 14 26 35; 15 23 46; 15 24 36; 15 26 34; 16 23 45; 16 24 35; 16 25 34; –
@JamesHarrison ok, je pensais qu'un 'sous-ensemble 'avec la longueur' p' ne pouvait faire qu'une partie d'un tuple, ce n'est pas le cas, il peut faire partie de multiples tuples tant que tuples sont uniques. J'ai mis à jour ma réponse et ajouté ce cas. –
@MuhammadTahir, Merci pour le deuxième code. Quand je l'ai essayé, il a retourné le message d'erreur suivant: "TypeError: argument entier attendu, got float" en ligne: "res = [x pour x dans itertools.combinations (com, len (s)/p) si set() .union (* x) == s] ". Pour le résoudre, j'ai édité le code en convertissant "len (s)/p" en "int (len (s)/p)". – 1man