Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为n种不同类型创建笛卡尔积_Python_Python 2.7 - Fatal编程技术网

Python 为n种不同类型创建笛卡尔积

Python 为n种不同类型创建笛卡尔积,python,python-2.7,Python,Python 2.7,假设我有一个包含n个不同类型的dict,这些类型由键表示: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":"goo

假设我有一个包含n个不同类型的dict,这些类型由键表示:
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"}]}
我是否应该从输入字典键中遍历每个
唯一对
,计算它们的笛卡尔乘积并附加它们的值? 如果出现另一个值(比如x3),如何连接其余的值

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

你能想出一个更简单有效的算法吗?或者这应该是方法?

您可以使用它来获得笛卡尔积。 要为新的dict重建键-值对,您可以在使用笛卡尔积之前,首先通过调用其上的列表来冻结键的顺序(
.keys
.values
在所有Python版本中都不能保证顺序,除非dict没有更改)。笛卡尔乘积中的值现在保持键的顺序,并且现在可以使用
zip
安全地构造结果dict的键-值对:

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)


这将扩展到原始列表包含的所有值列表。

您可以在理解中使用
itertools
模块中的
product

from itertools import product

a = {"x1":["foo1", "goo1" ,"doo1"], "x2":["foo2","goo2"]}
final = [{i:j for i, j in zip(a.keys(), k)} for k in product(*a.values())]
# Or:
# final = [dict(zip(a.keys(), k)) for k in product(*a.values())]
# Or:
# final = list(map(lambda x: dict(zip(a.keys(), x)), product(*a.values())))

print(final)
输出:

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

不清楚您为什么希望以这种格式输出。但是对于笛卡尔积,您可以只使用
itertools.product(*my_dict.values())
您可以添加
zip
方法和
*[dct[k]for k in key])
-为什么需要*参数。Thanks@JavaSa
*
用于解包值列表序列,以便将每个值列表作为参数传递给
产品
。在文档中描述了,我认为没有必要列出这些键,因为正是您给出的原因——字典没有被listcomp修改。诚然,我可能是..@DSM在意识到所谓的冻结是不必要的之前,我吐了很多文本,无法做出不会与其他答案冲突的修复。另一个答案很好地解决了这个问题。
[{'x1': 'foo1', 'x2': 'foo2'},
 {'x1': 'foo1', 'x2': 'goo2'},
 {'x1': 'goo1', 'x2': 'foo2'},
 {'x1': 'goo1', 'x2': 'goo2'},
 {'x1': 'doo1', 'x2': 'foo2'},
 {'x1': 'doo1', 'x2': 'goo2'}]