2013-03-04 132 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'}]