在python中将此单行嵌套for循环转换为多行

时间:2016-05-20 14:09:49

标签: python for-loop nested-loops

我无法理解我在这里修改的代码的区别。第一部分来自python documentation.

def product(*args, **kwds):
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

我想制作一段非常相似的代码,但是我们在实际为参数中的特定元素提取产品时有条件,所以我想将行result = [x+[y] for x in result for y in pool]转换为多行,然后我可以使用我的if语句等。这就是我所做的,但是当我运行它时,它似乎陷入无限循环,或某事......

def Myproduct(*args, **kwds):
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        for x in result:
            for y in pool:
                result.append(x+[y])
    for prod in result:
        yield tuple(prod)

我想真正理解这里的区别。我已经阅读并认为我得到this post,但我仍然没有看到如何在这种情况下正确转换,或者为什么它至少不是相同的转换。提前谢谢。

2 个答案:

答案 0 :(得分:4)

问题是您要添加到您要重复的列表中。因此,如果最初是result = [[]]pools = [1, 2, 3],那么在第一次迭代for x in result之后,您的列表将是[[], [] + [1]],那么您将抓住第二个元素等等。

列表理解是在一行中创建一个新列表,然后将其重命名为映射到结果。

要非常小心修改您要重复的列表!

答案 1 :(得分:2)

这是一个等效函数:

def myproduct(*args, **kwds):
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        nresult = []
        for x in result:
            for y in pool:
                nresult.append(x+[y])
        result = nresult
    for prod in result:
        yield tuple(prod)

请注意,nresult的创建是为了避免JETM指出的问题。