web-dev-qa-db-fra.com

Python: générer toutes les combinaisons à partir de valeurs dans dict of lists

Je voudrais générer toutes les combinaisons de valeurs qui sont dans des listes indexées dans un dict, comme ceci:

{'A':['D','E'],'B':['F','G','H'],'C':['I','J']}

À chaque fois, un élément de chaque entrée de dict serait sélectionné et combiné à des éléments d'autres clés afin que nous puissions avoir:

['D','F','I']
['D','F','J']
['D','G','I']
['D','G','J']
['D','H','I']
...
['E','H','J']

Je sais qu'il y a quelque chose qui permet de générer des combinaisons d'éléments dans la liste d'itertools, mais je ne pense pas pouvoir l'utiliser ici car j'ai différents "groupes" de valeurs.

Existe-t-il une solution pour cela, ou comment dois-je procéder moi-même, je suis tout à fait coincé avec cette structure imbriquée.

10
ibi0tux
import itertools as it

my_dict={'A':['D','E'],'B':['F','G','H'],'C':['I','J']}
allNames = sorted(my_dict)
combinations = it.product(*(my_dict[Name] for Name in allNames))
print(list(combinations))

qui imprime

[('D', 'F', 'I'), ('D', 'F', 'J'), ('D', 'G', 'I'), ('D', 'G ',' J '), (' D ',' H ',' I '), (' D ',' H ',' J '), (' E ',' F ',' I '), ( 'E', 'F', 'J'), ('E', 'G', 'I'), '' E ',' G ',' J '),' 'E', 'H', 'I'), ('E', 'H', 'J')]

23
Maryam

des combinaisons d'importation d'itertools

a = ['I1', 'I2', 'I3', 'I4', 'I5']

liste (combinaisons (a, 2))

et la sortie sera

[('I1', 'I2'), ('I1', 'I3'), ('I1', 'I4'), ('I1', 'I5'), ('I2', 'I3') , ('I2', 'I4'), ('I2', 'I5'), ('I3', 'I4'), ('I3', 'I5'), ('I4', 'I5') ]

2
Umesh Nepal

en complément, voici un 3-liner qui le fait en python pur pour vous donner l’idée, mais itertools est en effet plus efficace.

res = [[]]
for _, vals in my_dict.items():
    res = [x+[y] for x in res for y in vals]
print(res)
1
Max

Outre les produits cartésiens fournis par Maryam, vous pouvez également utiliser la boucle imbriquée naïve pour obtenir ce que vous voulez.

0
palebluedot