如何根据源字典中的值的笛卡尔积生成字典列表("展开"字典)?
假设你有一个字典,它的样子是这样的:
{
'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'}
]
2 个回答
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'}]
49
我觉得你想要的是笛卡尔积,而不是排列。在这种情况下,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'}]