Disons que j'ai une liste
magic_function([a,b,c], my_dict) . . . return [[a_prime, b, c], [a, b_prime, c], [a, b, c_prime], [a_prime, b_prime, c], [a_prime, b, c_prime], [a, b_prime, c_prime], [a_prime, b_prime, c_prime]]
et un dictionnaire
my_dict = dict({a:a_prime, b:b_prime, c:c_prime})
où toutes les lettres, letter_prime sont des entiers. Comment puis-je trouver toutes les combinaisons de création de listes uniques par rapport au dictionnaire? Avec mon exemple ci-dessus, j'aimerais une fonction qui prend [a, b, c], my_dict comme entrée
my_list = [a, b, c]
Avec une référence im unique aussi:
Je considère que [a_prime, b, c], [b, c, a_prime] est égal, c'est-à-dire que l'ordre ne correspond pas.
Et qu'il se peut que certaines combinaisons soient les mêmes, par exemple que [a_prime, b, c] se révèle également être égal [a, b_prime, c_prime]. Ce serait bien alors si un seul d'entre eux était retourné.
3 Réponses :
Vous pouvez utiliser la récursivité avec un générateur:
[['a', 'b', 'c'], ['a', 'b', 'c_prime'], ['a', 'b_prime', 'c'], ['a', 'b_prime', 'c_prime'], ['a_prime', 'b', 'c'], ['a_prime', 'b', 'c_prime'], ['a_prime', 'b_prime', 'c'], ['a_prime', 'b_prime', 'c_prime']]
Sortie:
my_list = ['a', 'b', 'c'] def combos(d, c = []): if len(c) == len(my_list): yield c elif d: yield from combos(d[1:], c+[d[0]]) yield from combos(d[1:], c+[f'{d[0]}_prime']) print(list(combos(my_list)))
Vous pouvez créer tous les masques possibles indiquant si nous choisissons la clé ou la valeur correspondante dans le dict:
uniques = set(tuple(combination) for combination in magic(['a', 'b', 'c']))
Si vous ne voulez que des valeurs uniques, utilisez simplement un ensemble:
XXX
Hmm parenthèse du milieu à l'extrémité droite, devrait probablement être un] dans les uniques = ...
@ Olba12 édité. J'aurais certainement dû le tester avant! : - /
Si j'ai la liste suivante [[1,2], [2,1]], je considère que [1,2] et [2,1] sont identiques, donc lors du filtrage pour unique, id aime obtenir soit [ 1,2] ou [2,1], comme mentionné dans la question. Mais set ([tuple (combinaison) pour combinaison dans [[1,2], [2,1]]]) renvoie {(1, 2), (2, 1)}
from itertools import product combinations = [list(x) for x in product(*my_coll)] Output: >> [['a', 'b', 'c'], ['a', 'b', 'c_prime'], ['a', 'b_prime', 'c'], ['a', 'b_prime', 'c_prime'], ['a_prime', 'b', 'c'], ['a_prime', 'b', 'c_prime'], ['a_prime', 'b_prime', 'c'], ['a_prime', 'b_prime', 'c_prime']]
my_dict
ne devrait-il pas également être une entrée dans votre fonction? Dans tous les cas,itertools.combinations
peut être utilisé pour parcourir des combinaisons.@JohnColeman en effet! J'ai mis à jour la question.
Si
ma_liste
est toujourslist (my_dict.keys ())
alors la fonction que vous recherchez est vraiment une fonction du dictionnaire, ce qui serait alors le choix naturel pour la semelle saisir.@JohnColeman Ce n'est pas