2013-03-04 184 views
7

的列表中給出,看起來像這樣一本字典:結合Python的字典排列組合成字典

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

如何創建,結合了第一字典的鍵的不同值的詞典列表?我要的是:

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

如果您向我們展示了您嘗試過的內容,這將是一個很好的問題。 – msvalkon 2013-03-04 21:54:18

+1

我會說在任何情況下這都是一個很好的問題,因爲在這裏想出正確的概念並不容易。 – 2013-03-04 22:00:36

回答

22

我想你想的笛卡爾積,不置換,在這種情況下itertools.product可以幫助:

>>> 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。很高興知道Python以'zip()'和'.values()'這兩個相同的,可重複的順序迭代字典項目! – 2013-03-04 21:59:36

+2

@TimPietzcker:是的,這個屬性是[記錄](http://docs.python.org/2/library/stdtypes.html#dict.items),可以依賴。訂單本身是任意的,但沒有兼容的Python實現可能違反了如果不修改'd','d.keys()'(這裏'd')和'd.values()'必須匹配的保證。 – DSM 2013-03-04 22:04:50

+0

這正是我想要的!謝謝。 – user1272534 2013-03-04 22:32:20

1

,可以獲取結果這樣:

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 

結果:

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