Python:使用for-loop创建未知数量的变量

时间:2016-03-29 22:33:09

标签: python python-2.7 product kwargs

我想创建一个接收任意数量的关键字参数的生成器,它将返回值的乘积(给出如下所示的元组)。

我无法避免对for循环变量进行硬编码(hardcoded_ahardcoded_b)。在这种情况下,如果我使用多于或少于两个参数,则会给出ValueError。我不关心硬编码'好'的变量。我怎么能这样做呢,无论我传给kwargs有多少物品,我仍然能够得到产品?

这是我到目前为止所写的:

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

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找的是以下内容:

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))

答案 1 :(得分:1)

除非我误解了你的目标,否则以下情况应该有效:

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)]