1
votes

Différentes combinaisons d'une liste par rapport à un dictionnaire

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é.


4 commentaires

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 toujours list (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


3 Réponses :


1
votes

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)))


0 commentaires

3
votes

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


3 commentaires

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)}



0
votes
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']]

0 commentaires