2013-03-04 24 views
7

Biorąc słownikiem że wygląda tak:Kombajny Python słownik Permutacje do listy słowników

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

Jak mogę utworzyć listę słowników, które łączy w sobie różne wartości kluczy pierwszy słownik użytkownika? Co chcę jest:

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

To byłoby dobre pytanie, gdybyś pokazał nam, co próbujesz. – msvalkon

+1

Powiedziałbym, że to dobre pytanie, ponieważ nie jest łatwo wymyślić właściwą koncepcję. –

Odpowiedz

22

myślę chcesz iloczyn kartezjański, a nie permutacji, w którym to przypadku itertools.product może pomóc:

>>> 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. Dobrze wiedzieć, że Python iteruje po elementach słownika w tej samej, powtarzalnej kolejności, zarówno dla 'zip()' jak i '.values ​​()'! –

+2

@TimPietzcker: tak, ta właściwość jest [udokumentowana] (http://docs.python.org/2/library/stdtypes.html#dict.items) i można na niej polegać. Sam porządek jest arbitralny, ale żadna zgodna implementacja Pythona nie może naruszyć gwarancji, że jeśli nie modyfikujesz 'd',' d.keys() '(tutaj' d') i 'd.values ​​()' muszą się zgadzać . – DSM

+0

Dokładnie tego chciałem! Dziękuję Ci. – user1272534

1

Można uzyskać ten rezultat ten sposób:

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 

wynik:

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