Python 分解dict-获取字典中所有值的组合

Python 分解dict-获取字典中所有值的组合,python,dictionary,cartesian-product,Python,Dictionary,Cartesian Product,我希望将字典中的所有值组合作为多个字典(每个字典包含原始值的每个键,但只包含原始值的一个值)。假设我想用以下参数化函数调用: kwargs = {'a': [1, 2, 3], 'b': [1, 2, 3]} 如何获得所有组合的列表,如下所示: combinations = [{'a': 1, 'b': 1}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3}, {'a': 2, 'b': 1}, {'a': 2, 'b': 2}, {'a'

我希望将字典中的所有值组合作为多个字典(每个字典包含原始值的每个键,但只包含原始值的一个值)。假设我想用以下参数化函数调用:

kwargs = {'a': [1, 2, 3], 'b': [1, 2, 3]}
如何获得所有组合的列表,如下所示:

combinations = [{'a': 1, 'b': 1}, {'a': 1, 'b': 2}, {'a': 1, 'b': 3},
                {'a': 2, 'b': 1}, {'a': 2, 'b': 2}, {'a': 2, 'b': 3},
                {'a': 3, 'b': 1}, {'a': 3, 'b': 2}, {'a': 3, 'b': 3}]
在原始的
kwargs
中可以有任意数量的键,每个值都被认为是可引用的,但值的数量不是固定的


如果可能的话:最后的
组合
应该是一个生成器(而不是列表)。

您可以将
kwargs
展平为类似的内容

>>> kwargs = {'a': [1, 2, 3], 'b': [1, 2, 3]}
>>> flat = [[(k, v) for v in vs] for k, vs in kwargs.items()]
>>> flat
[[('b', 1), ('b', 2), ('b', 3)], [('a', 1), ('a', 2), ('a', 3)]]
>>> from itertools import product
>>> [dict(items) for items in product(*flat)]
[{'a': 1, 'b': 1},
 {'a': 2, 'b': 1},
 {'a': 3, 'b': 1},
 {'a': 1, 'b': 2},
 {'a': 2, 'b': 2},
 {'a': 3, 'b': 2},
 {'a': 1, 'b': 3},
 {'a': 2, 'b': 3},
 {'a': 3, 'b': 3}]
然后,你可以像这样使用

>>> kwargs = {'a': [1, 2, 3], 'b': [1, 2, 3]}
>>> flat = [[(k, v) for v in vs] for k, vs in kwargs.items()]
>>> flat
[[('b', 1), ('b', 2), ('b', 3)], [('a', 1), ('a', 2), ('a', 3)]]
>>> from itertools import product
>>> [dict(items) for items in product(*flat)]
[{'a': 1, 'b': 1},
 {'a': 2, 'b': 1},
 {'a': 3, 'b': 1},
 {'a': 1, 'b': 2},
 {'a': 2, 'b': 2},
 {'a': 3, 'b': 2},
 {'a': 1, 'b': 3},
 {'a': 2, 'b': 3},
 {'a': 3, 'b': 3}]
itertools.product
实际上返回一个迭代器。因此,您可以按需获取值并构建字典。或者可以使用
map
,这也会返回迭代器

>>> for item in map(dict, product(*flat)):
...     print(item)
...
...
{'b': 1, 'a': 1}
{'b': 1, 'a': 2}
{'b': 1, 'a': 3}
{'b': 2, 'a': 1}
{'b': 2, 'a': 2}
{'b': 2, 'a': 3}
{'b': 3, 'a': 1}
{'b': 3, 'a': 2}
{'b': 3, 'a': 3}

另一种方法是,先构建值元组,然后再与键结合(与@thefourtheye的方法正好相反:-)


这不是依赖于实现细节吗,因为它要求键迭代器和值迭代器具有相同的顺序?Dict没有排序要求,我认为也不能保证这些迭代器必须具有相同的顺序。@zstewart为什么不检查文档呢?它说它们有相同的顺序,甚至给出了示例
pairs=zip(d.values(),d.keys())
@StefanPochmann你是说