Python: 使用 for 循环创建未知数量的变量
Python: Creating unknown number of variables using for-loop
我想创建一个接受任意数量关键字参数的生成器,它将 return 值的乘积(如下所示作为元组给出)。
我无法避免对 for 循环变量进行硬编码 (hardcoded_a
、hardcoded_b
)。在这种情况下,如果我使用多于或少于两个参数,它会给出 ValueError
。我不关心 'okay' 变量的硬编码。我怎样才能做到无论我将多少物品传递给 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
除非我误解了您的 objective,否则以下内容应该有效:
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()
不保证有特定的顺序。这将确保它们按关键字的 "natural ordering"(字符串比较)排序:
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)]
我想你要找的是以下内容:
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))
我想创建一个接受任意数量关键字参数的生成器,它将 return 值的乘积(如下所示作为元组给出)。
我无法避免对 for 循环变量进行硬编码 (hardcoded_a
、hardcoded_b
)。在这种情况下,如果我使用多于或少于两个参数,它会给出 ValueError
。我不关心 'okay' 变量的硬编码。我怎样才能做到无论我将多少物品传递给 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
除非我误解了您的 objective,否则以下内容应该有效:
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()
不保证有特定的顺序。这将确保它们按关键字的 "natural ordering"(字符串比较)排序:
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)]
我想你要找的是以下内容:
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))