Dividir el diccionario de Python para obtener todas las combinaciones de valores.

my_dict = {'a':[1,2], 'b':[3], 'c':{'d':[4,5], 'e':[6,7]}} 

Necesito derivar todas las combinaciones como se muestra abajo.

 {'a':1, 'b':3, 'c':{'d':4, 'e':6}} {'a':1, 'b':3, 'c':{'d':4, 'e':7}} {'a':1, 'b':3, 'c':{'d':5, 'e':6}} {'a':1, 'b':3, 'c':{'d':5, 'e':7}} {'a':2, 'b':3, 'c':{'d':4, 'e':6}} 

y así. Podría haber cualquier nivel de anidación aquí
Por favor, déjame saber cómo lograr esto
Algo que probé está pegado debajo pero definitivamente no estaba llegando a ninguna parte.

 def gen_combinations(data): my_list =[] if isinstance(data, dict): for k, v in data.iteritems(): if isinstance(v, dict): gen_combinations(v) elif isinstance(v, list): for i in range(len(v)): temp_dict = data.copy() temp_dict[k] = v[i] print temp_dict my_dict = {'a':[1,2], 'b':[3], 'c':{'d':[4,5], 'e':[6,7]}} gen_combinations(my_dict) 

Que resultó en

 {'a': 1, 'c': {'e': [6, 7], 'd': [4, 5]}, 'b': [3]} {'a': 2, 'c': {'e': [6, 7], 'd': [4, 5]}, 'b': [3]} {'e': 6, 'd': [4, 5]} {'e': 7, 'd': [4, 5]} {'e': [6, 7], 'd': 4} {'e': [6, 7], 'd': 5} {'a': [1, 2], 'c': {'e': [6, 7], 'd': [4, 5]}, 'b': 3} 

 from itertools import product my_dict = {'a':[1,2], 'b':[3], 'c':{'d':[4,5], 'e':[6,7]}} def process(d): to_product = [] # [[('a', 1), ('a', 2)], [('b', 3),], ...] for k, v in d.items(): if isinstance(v, list): to_product.append([(k, i) for i in v]) elif isinstance(v, dict): to_product.append([(k, i) for i in process(v)]) else: to_product.append([(k, v)]) return [dict(l) for l in product(*to_product)] for i in process(my_dict): print(i) 

Salida:

 {'a': 1, 'b': 3, 'c': {'e': 6, 'd': 4}} {'a': 2, 'b': 3, 'c': {'e': 6, 'd': 4}} {'a': 1, 'b': 3, 'c': {'e': 6, 'd': 5}} {'a': 2, 'b': 3, 'c': {'e': 6, 'd': 5}} {'a': 1, 'b': 3, 'c': {'e': 7, 'd': 4}} {'a': 2, 'b': 3, 'c': {'e': 7, 'd': 4}} {'a': 1, 'b': 3, 'c': {'e': 7, 'd': 5}} {'a': 2, 'b': 3, 'c': {'e': 7, 'd': 5}} 

Actualizaciones:

Código que funciona como se solicita aquí :

 from itertools import product my_dict = {'a':[1,2], 'e':[7], 'f':{'x':[{'a':[3,5]}, {'a':[4]}] } } def process(d): to_product = [] # [[('a', 1), ('a', 2)], [('b', 3),], ...] for k, v in d.items(): if isinstance(v, list) and all(isinstance(i, dict) for i in v): # specific case, when list of dicts process differently... c = product(*list(process(i) for i in v)) to_product.append([(k, list(l)) for l in c]) elif isinstance(v, list): to_product.append([(k, i) for i in v]) elif isinstance(v, dict): to_product.append([(k, i) for i in process(v)]) else: to_product.append([(k, v)]) return [dict(l) for l in product(*to_product)] for i in process(my_dict): print(i) 

Salida:

 {'f': {'x': [{'a': 3}, {'a': 4}]}, 'a': 1, 'e': 7} {'f': {'x': [{'a': 3}, {'a': 4}]}, 'a': 2, 'e': 7} {'f': {'x': [{'a': 5}, {'a': 4}]}, 'a': 1, 'e': 7} {'f': {'x': [{'a': 5}, {'a': 4}]}, 'a': 2, 'e': 7} 

Resuélvelo con dos pasos.

Primero reemplace cada dictado con una lista de dictados generados por combinaciones de gen, llamadas recursivamente.

En segundo lugar, hacer la unión interna entre todas las claves. Cada tecla tiene una lista plana ahora.