我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积。
我看过了itertools,但是它的product功能并不是我想要的。有没有一种简单明了的方法来获取一个字典,每个字典中包含任意数量的键 和 每个值中任意数量的元素,然后生成具有下一个排列的字典?
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。另外,我认为编写生成器函数(而不是返回生成器表达式的函数)会使代码更清晰。所以:
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之前防止键/值被排序。
list(product_dict(**mydict))