我想要创建一个生成器,它接受任意数量的关键字参数,它将返回值的乘积(如下面所示,以元组的形式提供)。
我很难避免硬编码for循环变量(hardcoded_a,hardcoded_b)。在这个场景中,如果我使用了多或两个以上的参数,它就会给出一个ValueError。我不关心硬编码'okay‘变量。我怎么能这样做,所以,无论我传递多少个项目,我仍然可以生产的产品?
这就是我到目前为止所写的:
from itertools import product
def gen(**kwargs):
options = {}
[options.update({k: v}) for k, v in kwargs.iteritems()]
for hardcoded_a, hardcoded_b in product(*(tuple(options.values()))):
yield hardcoded_a, hardcoded_b
for okay_var1, okay_var2 in gen(dollar=(2, 20), hungry=(True, False)):
print okay_var1, okay_var2发布于 2016-03-29 22:50:06
我想你要找的是:
def gen(**kwargs):
options = {}
[options.update({k: v}) for k, v in kwargs.iteritems()]
for prod in product(*(tuple(options.values()))):
yield dict(zip(options, prod))或者一个更干净的解决方案:
def gen(**kwargs):
for prod in product(*kwargs.values()):
yield dict(zip(kwargs, prod))发布于 2016-03-29 22:47:22
除非我误解了你的目标,否则以下几点应该奏效:
from itertools import product
def gen(**kwargs):
return product(*kwargs.values())示例:
>>> print(list(gen(dollar=(2,20), hungry=(True,False))))
[(True, 2), (True, 20), (False, 2), (False, 20)]但是,值得注意的是,kwargs.values()并不一定会有特定的订单。这将确保它们由关键字的“自然排序”(字符串比较)排序:
def gen2(**kwargs):
return product(*map(lambda t:t[1],sorted(k.items())))所以现在:
>>> print(list(gen2(dollar=(2,20), hungry=(True,False))))
[(2, True), (2, False), (20, True), (20, False)]https://stackoverflow.com/questions/36296289
复制相似问题