如果我有任意数量的元素,每个元素都有一组指定的值,我怎么做才能从每个元素的集合中获得一个值的所有可能组合?
例如,假设我有:
elems = {"A": (0, 1), "B": (-1, -5)}
我怎么做才能得到以下结果?
({"A": 0, "B": -1}, {"A": 0, "B": -5}, {"A": 1, "B": -1}, {"A": 1, "B": -5})
输入/输出不需要使用字典,但我认为这是最简单的表示方式。假设字典顺序很重要。
我想知道一种方法:
- 不像在示例中那样假设只有2个元素。
- 不假设所有元素的集合长度相等。
这有点像列出真值表的所有输入。
您可以使用嵌套的列表/字典推导式,使用itertools.product
生成所有值的组合,然后将每个结果元组的zip
转换为键以生成键/值对以组成每个字典结果。下面是一个使用稍微复杂的数据版本的示例:
import itertools
elems = {"A": (0, 1), "B": (-1, -5), "C": (1, 2, 3) }
keys = elems.keys()
res = [dict(zip(keys, p)) for p in itertools.product(*elems.values())]
输出:
[
{'A': 0, 'B': -1, 'C': 1},
{'A': 0, 'B': -1, 'C': 2},
{'A': 0, 'B': -1, 'C': 3},
{'A': 0, 'B': -5, 'C': 1},
{'A': 0, 'B': -5, 'C': 2},
{'A': 0, 'B': -5, 'C': 3},
{'A': 1, 'B': -1, 'C': 1},
{'A': 1, 'B': -1, 'C': 2},
{'A': 1, 'B': -1, 'C': 3},
{'A': 1, 'B': -5, 'C': 1},
{'A': 1, 'B': -5, 'C': 2},
{'A': 1, 'B': -5, 'C': 3}
]