我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积。
我看过了itertools
,但是它的product
功能并不是我想要的。有没有一种简单明了的方法来获取一个字典,每个字典中包含任意数量的键 和
每个值中任意数量的元素,然后生成具有下一个排列的字典?
输入:
options = {"number": [1,2,3], "color": ["orange","blue"] }
print list( my_product(options) )
输出示例:
[ {"number": 1, "color": "orange"},
{"number": 1, "color": "blue"},
{"number": 2, "color": "orange"},
{"number": 2, "color": "blue"},
{"number": 3, "color": "orange"},
{"number": 3, "color": "blue"}
]
好的,感谢@dfan告诉我我在错误的位置查看。我现在知道了:
from itertools import product
def my_product(inp):
return (dict(zip(inp.keys(), values)) for values in product(*inp.values())
编辑
:经过多年的Python经验,我认为一个更好的解决方案是接受kwargs
输入,而不是输入字典。呼叫样式与原始呼叫样式更加类似itertools.product
。另外,我认为编写生成器函数(而不是返回生成器表达式的函数)会使代码更清晰。所以:
def product_dict(**kwargs):
keys = kwargs.keys()
vals = kwargs.values()
for instance in itertools.product(*vals):
yield dict(zip(keys, instance))
如果你需要在一个字典来传递,list(product_dict(**mydict))
。使用kwargs
而不是任意输入类的一个显着变化是,它至少在Python
3.6之前防止键/值被排序。
问题内容: 我试图解决中提到的问题这篇文章。考虑一个非负整数列表。我想要一套的笛卡尔积。例如,如果我可以使用itertools: 如果您能帮助我知道如何生成任意长度的using ,我将不胜感激。 问题答案: 您可以使用映射的所有项目来,然后解开他们:
问题内容: 如何从一组列表中获得笛卡尔积(值的所有可能组合)? 输入: 所需的输出: 问题答案: 在Python 2.6+中
问题内容: 以下代码适用于,它是否也返回重复的笛卡尔积,如果是,如何获得唯一的笛卡尔积? 当我传递包含列表的列表时,这似乎也不起作用 问题答案: 要仅获取唯一元素,可以使用这样的set表示法( 注意: 这不能保证顺序) 或根据Paul Draper的评论,我们可以像这样 如果您也想维护订单 要使您的程序可以使用列表列表,只需将函数声明从 至
问题内容: 我有两个pandas数据框: 获得其笛卡尔积的最佳实践是什么(当然不用像我这样明确地编写它)? 问题答案: 如果每行都有一个重复的键,则可以使用merge生成笛卡尔乘积(就像在SQL中一样)。 输出:
问题内容: 在Tensorflow中有什么简单的方法可以像itertools.product一样做笛卡尔积吗?我想获得两个张量(和)的元素组合,在Python中可以通过itertools作为。我正在Tensorflow中寻找替代方案。 问题答案: 我将在此假定和均为一维张量。 为了得到两者的笛卡尔积,我会用的组合和: 您使用LEN(一) LEN(B) 2张量,其中的元件的每个组合结束并且在最后一维
假设我有几个,我会将它们放入另一个列表或其他集合中,所以在调用之前,我不知道我有多少个 应该是: