首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:使用for-循环创建未知数量的变量

Python:使用for-循环创建未知数量的变量
EN

Stack Overflow用户
提问于 2016-03-29 22:33:08
回答 2查看 1.9K关注 0票数 2

我想要创建一个生成器,它接受任意数量的关键字参数,它将返回值的乘积(如下面所示,以元组的形式提供)。

我很难避免硬编码for循环变量(hardcoded_ahardcoded_b)。在这个场景中,如果我使用了多或两个以上的参数,它就会给出一个ValueError。我不关心硬编码'okay‘变量。我怎么能这样做,所以,无论我传递多少个项目,我仍然可以生产的产品?

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-29 22:50:06

我想你要找的是:

代码语言:javascript
复制
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))

或者一个更干净的解决方案:

代码语言:javascript
复制
def gen(**kwargs):
    for prod in product(*kwargs.values()):
       yield dict(zip(kwargs, prod))
票数 3
EN

Stack Overflow用户

发布于 2016-03-29 22:47:22

除非我误解了你的目标,否则以下几点应该奏效:

代码语言:javascript
复制
from itertools import product

def gen(**kwargs):
    return product(*kwargs.values())

示例:

代码语言:javascript
复制
>>> print(list(gen(dollar=(2,20), hungry=(True,False))))
[(True, 2), (True, 20), (False, 2), (False, 20)]

但是,值得注意的是,kwargs.values()并不一定会有特定的订单。这将确保它们由关键字的“自然排序”(字符串比较)排序:

代码语言:javascript
复制
def gen2(**kwargs):
    return product(*map(lambda t:t[1],sorted(k.items())))

所以现在:

代码语言:javascript
复制
>>> print(list(gen2(dollar=(2,20), hungry=(True,False))))
[(2, True), (2, False), (20, True), (20, False)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36296289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档