2013-03-04 11 views
7

Dato un dizionario che assomiglia a questo:Combinare Python dizionario permutazioni nella Lista di dizionari

{ 
    'Color': ['Red', 'Yellow'], 
    'Size': ['Small', 'Medium', 'Large'] 
} 

Come si crea un elenco di dizionari che combina i vari valori delle chiavi del primo dizionario? Quello che voglio è:

[ 
    {'Color': 'Red', 'Size': 'Small'}, 
    {'Color': 'Red', 'Size': 'Medium'}, 
    {'Color': 'Red', 'Size': 'Large'}, 
    {'Color': 'Yellow', 'Size': 'Small'}, 
    {'Color': 'Yellow', 'Size': 'Medium'}, 
    {'Color': 'Yellow', 'Size': 'Large'} 
] 
+0

Questa sarebbe una buona domanda se ci mostrassi cosa hai provato. – msvalkon

+1

Direi che questa è una buona domanda in ogni caso, perché non è facile trovare il concetto giusto qui. –

risposta

22

Penso che si desidera il prodotto cartesiano, non una permutazione, nel qual caso itertools.product può aiutare:

>>> from itertools import product 
>>> d = {'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']} 
>>> [dict(zip(d, v)) for v in product(*d.values())] 
[{'Color': 'Red', 'Size': 'Small'}, {'Color': 'Red', 'Size': 'Medium'}, {'Color': 'Red', 'Size': 'Large'}, {'Color': 'Yellow', 'Size': 'Small'}, {'Color': 'Yellow', 'Size': 'Medium'}, {'Color': 'Yellow', 'Size': 'Large'}] 
+1

+1. Buono a sapersi che Python esegue iterazioni sugli elementi del dizionario nello stesso ordine riproducibile, sia per 'zip()' che per '.values ​​()'! –

+2

@TimPietzcker: sì, questa proprietà è [documentata] (http://docs.python.org/2/library/stdtypes.html#dict.items) e può essere invocata. L'ordine stesso è arbitrario, ma nessuna implementazione Python compatibile può violare la garanzia che se non si modifica 'd',' d.keys() '(qui' d') e 'd.values ​​()' devono corrispondere . – DSM

+0

Questo è esattamente quello che volevo! Grazie. – user1272534

1

È possibile ottenere questo risultato facendo questo:

x={'Color': ['Red', 'Yellow'], 'Size': ['Small', 'Medium', 'Large']} 
keys=x.keys() 
values=x.values() 

matrix=[] 
for i in range(len(keys)): 
    cur_list=[] 
    for j in range(len(values[i])): 
      cur_list.append({keys[i]: values[i][j]}) 
    matrix.append(cur_list) 

y=[] 
for i in matrix[0]: 
    for j in matrix[1]: 
      y.append(dict(i.items() + j.items())) 

print y 

risultato:

[{'Color': 'Red', 'Size': 'Small'}, {'Color': 'Red', 'Size': 'Medium'}, {'Color': 'Red', 'Size': 'Large'}, {'Color': 'Yellow', 'Size': 'Small'}, {'Color': 'Yellow', 'Size': 'Medium'}, {'Color': 'Yellow', 'Size': 'Large'}] 
Problemi correlati