使用itertools.product解压缩列表的说明

时间:2017-05-26 04:39:42

标签: python args iterable-unpacking

我似乎无法解开如何解包(*)以及itertools.product()如何使用下面的示例。

  RCPT TO:<forward-path> [ SP <rcpt-parameters> ] <CRLF>

输出:

for x in product(["ghi","abc"]):
    print(x)

使用*

('ghi',)
('abc',)

输出:

for x in product(*["ghi","abc"]):
    print(x)

这个输出是如何产生的?我知道product()通常会根据“重复”的数量生成组合。至于上面,重复默认为1.为什么没有生成(&#39; a&#39;&#39; g&#39;)?

我猜('g', 'a') ('g', 'b') ('g', 'c') ('h', 'a') ('h', 'b') ('h', 'c') ('i', 'a') ('i', 'b') ('i', 'c') 实际产生的*["ghi","abc"]函数是什么?我的意思是我看到结果是什么,但我似乎无法得到它是如何工作的。

1 个答案:

答案 0 :(得分:2)

当您将参数解包为product时,它与手动输入列表中的每个元素作为参数相同。那就是:

product(*[a, b]) == product(a, b)

所以你真正做的是将列表中的每个字符串传递给product()。 Python就是在幕后为你做这件事。

('a', 'g')未出现在结果中的原因仅仅是因为产品如何运作。 The official documentation of product does a good job of explaining how exactly it works

  

输入迭代的笛卡尔积。

     

大致相当于生成器表达式中的嵌套for循环。例如,product(A, B)返回与((x,y) for x in A for y in B)相同的内容。

     

嵌套循环像里程表一样循环,最右边的元素在每次迭代时前进。此模式创建了一个字典顺序,以便在输入的可迭代内容进行排序时,产品元组按排序顺序发出。

     

要计算iterable与其自身的乘积,请使用可选的 repeat 关键字参数指定重复次数。例如,product(A, repeat=4)表示与product(A, A, A, A)相同。

     

此函数大致等同于以下代码,但实际实现不会在内存中构建中间结果:

def product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)