将Python字典排列组合成字典列表

use*_*534 16 python dictionary python-2.7

鉴于字典看起来像这样:

{
    'Color': ['Red', 'Yellow'],
    'Size': ['Small', 'Medium', 'Large']
}
Run Code Online (Sandbox Code Playgroud)

如何创建一个结合了第一个字典键的各种值的字典列表?我想要的是:

[
    {'Color': 'Red', 'Size': 'Small'},
    {'Color': 'Red', 'Size': 'Medium'},
    {'Color': 'Red', 'Size': 'Large'},
    {'Color': 'Yellow', 'Size': 'Small'},
    {'Color': 'Yellow', 'Size': 'Medium'},
    {'Color': 'Yellow', 'Size': 'Large'}
]
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 32

我想你想要笛卡尔积,而不是排列,在这种情况下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'}]
Run Code Online (Sandbox Code Playgroud)

  • +1。很高兴知道 Python 以相同的、可重现的顺序迭代字典项,包括 `zip()` 和 `.values()`! (2认同)
  • @TimPietzcker:是的,这个属性是[记录](http://docs.python.org/2/library/stdtypes.html#dict.items),可以依赖.顺序本身是任意的,但是没有兼容的Python实现可以违反保证,如果你不修改`d`,`d.keys()`(这里是'd`)和`d.values()`必须匹配. (2认同)