2013-03-04 20 views
7

ein Wörterbuch gegeben, die wie folgt aussieht:Kombinieren Python Wörterbuch Permutationen in Liste der Wörterbücher

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

Wie kann ich eine Liste der Wörterbücher erstellen, die die verschiedenen Werte des ersten Wörterbuch der Schlüssel kombiniert? Was ich will, ist:

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

Das wäre eine gute Frage, wenn Sie uns zeigen würden, was Sie versucht haben. – msvalkon

+1

Ich würde sagen, das ist auf jeden Fall eine gute Frage, weil es nicht einfach ist, hier das richtige Konzept zu finden. –

Antwort

22

Ich glaube, Sie das kartesische Produkt will, nicht eine Permutation, wobei in diesem Fall itertools.product helfen:

>>> 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. Gut zu wissen, dass Python die Wörterbuchelemente in der gleichen, reproduzierbaren Reihenfolge sowohl für die 'zip()' als auch für die '.values ​​()' iteriert! –

+2

@TimPietzcker: Ja, diese Eigenschaft ist [dokumentiert] (http://docs.python.org/2/library/stdtypes.html#dict.items) und man kann sich darauf verlassen. Die Reihenfolge selbst ist beliebig, aber keine konforme Python-Implementierung kann die Garantie verletzen, dass, wenn Sie 'd' nicht ändern,' d.keys() '(hier' d') und 'd.values ​​()' übereinstimmen müssen . – DSM

+0

Das ist genau das, was ich wollte! Vielen Dank. – user1272534

1

Sie dieses Ergebnis erzielen können, dies zu tun:

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 

Ergebnis:

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