考虑我有一个字典,其中包含由键表示的 n 个不同类型:x1, x2 ..xn
为简单起见,让我们举一个小例子:

{"x1":["foo1", "goo1" ,"doo1"], "x2":["foo2","goo2"]}

我想计算上述的笛卡尔积。我的输出应该是:
{"output":[{"x1":"foo1", "x2":"foo2"}, {"x1":"foo1", "x2":"goo2"}, {"x1":"goo1", "x2":"foo2"} , {"x1":"goo1", "x2":"goo2"}, {"x1":"doo1", "x2":"foo2"} {"x1":"doo1", "x2":"goo2"}]}

我应该从输入字典键中遍历每个 unique pair 并计算它们的笛卡尔积并附加它们的值吗?
如果出现另一个值,例如 x3,我该如何连接其余的值?

在这种方法中,我将计算 x1*x2 值的笛卡尔积
然后是 x2*x3 值以及如何将结果合并为 x1*x2*x3?

你能想到一个更简单的算法和一个高效的算法吗?或者这应该是方式?

最佳答案

您可以使用 itertools.product 来获取笛卡尔积。
要为新的 dict 重建键值对,您可以首先通过在获取笛卡尔积之前调用 list 来卡住键的顺序(除非 dict 未更改,否则所有 Python 版本都不能保证 .keys.values 排序)。笛卡尔积的值现在保持键的顺序,结果字典的键值对现在可以使用 zip 安全地构造:

from itertools import product
from pprint import pprint

dct = {"x1":["foo1", "goo1" ,"doo1"], "x2":["foo2","goo2"]}

keys = list(dct)
lst = [dict(zip(keys, vals)) for vals in product(*[dct[k] for k in keys])]
pprint(lst)
[{'x1': 'foo1', 'x2': 'foo2'},
 {'x1': 'foo1', 'x2': 'goo2'},
 {'x1': 'goo1', 'x2': 'foo2'},
 {'x1': 'goo1', 'x2': 'goo2'},
 {'x1': 'doo1', 'x2': 'foo2'},
 {'x1': 'doo1', 'x2': 'goo2'}]

这将扩展为与原始列表包含的值列表一样多。

关于python - 为 n 个不同类型创建笛卡尔积,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44478164/

10-10 10:09