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

Ich muss alle Kombinationen daraus wie folgt ableiten.Split Python-Wörterbuch, um in allen Kombinationen von Werten

{'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}} 

und so weiter. Es könnte eine Ebene hier nisten
Bitte lassen Sie mich wissen, wie diese
etwas zu erreichen, die ich versucht unten geklebt ist aber auf jeden Fall nirgends erreichte

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) 

die in
führte

{'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} 
+1

Bitte lassen Sie uns wissen, was Sie bisher versucht haben! –

+0

Ich nehme an, Sie möchten die verschachtelten Diktate auch glätten? –

+0

@Suren können Sie die Diskussion unter meiner Antwort betrachten? Welche Ausgabe für den Schlüssel 'e' willst du für' {'a': [1, 2], 'b': [3], 'c': {'d': {4: [3, 4]}, 'e': [6, 7, [1, 2]]}} '? –

Antwort

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

Ausgabe:

{'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}} 

Upd:

Code, wie gefragt here funktioniert:

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) 

Ausgang:

{'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} 
+0

Große Antwort, wusste nicht über 'Produktfunktion vorher, sehr hilfreich! –

+0

Schön! Wie wäre es mit anderen Iterablen, außer nur nach der Liste zu filtern? In den Zeilen von 'try: to_product.append ([{k: i} für i in v]) außer TypeError: ...'? – hochl

+0

Ich denke, das scheitert bei verschachtelten Diktaten '{'a': [1, 2], 'b': [3], 'c': {'d': {4: [3, 4]}, 'e ': [6, 7, [1, 2]]}} ' –

-1

es Lösen Sie mit zwei Schritten.

Ersetzen Sie zuerst jedes dict durch eine Liste von dicts, die von gen_combinations generiert wurden und rekursiv aufgerufen werden.

Zweitens, machen Sie die innere Verbindung zwischen allen Schlüsseln. Jeder Schlüssel hat jetzt eine flache Liste.

Verwandte Themen