Python itertools.product-返回列表而不是元组

Python itertools.product-返回列表而不是元组,python,itertools,Python,Itertools,我希望itertools.product返回一个列表而不是元组。我目前正在创建自己的函数,如下所示: def product_list(*args, **kwds): # 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 = map(tuple, args) * kwd

我希望
itertools.product
返回一个列表而不是元组。我目前正在创建自己的函数,如下所示:

def product_list(*args, **kwds):
    # 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 = 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 list(prod)  # Yields list() instead of tuple()
for r0 in product_list([0, 1], repeat=3):
    r0.insert(0, 0)
    for r1 in product_list([0, 1], repeat=3):
        r1.insert(1, 0)
        for r2 in product_list([0, 1], repeat=3):
            r2.insert(2, 0)
            for r3 in product_list([0, 1], repeat=3):
                r3.insert(3, 0)
代码来自Python文档——我刚刚修改了最后一行。这很好,但似乎不是很聪明

还有其他的方法吗?我正在考虑使用类似于
装饰器的东西,或者用我自己的生成器函数来包装它。我对这两个概念都不太熟悉,如果有人能给我演示一下,我将不胜感激

编辑 我在做这样的事情:

def product_list(*args, **kwds):
    # 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 = 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 list(prod)  # Yields list() instead of tuple()
for r0 in product_list([0, 1], repeat=3):
    r0.insert(0, 0)
    for r1 in product_list([0, 1], repeat=3):
        r1.insert(1, 0)
        for r2 in product_list([0, 1], repeat=3):
            r2.insert(2, 0)
            for r3 in product_list([0, 1], repeat=3):
                r3.insert(3, 0)

因此,我希望我的函数返回一个列表,而不是每次都强制转换它。(我知道代码很混乱,需要递归,但我稍后会考虑。我更感兴趣的是学习如何执行上面所述的操作)

itertools。产品是一个生成器,您可以轻松地将生成器链接在一起。下面是一个生成器表达式,它将
product
生成的每个元组更改为一个列表:

(list(tup) for tup in itertools.product(iterable1, iterable2, etc))
在示例代码中,可以使用生成器表达式,也可以使用不同的方法在值的前面添加一个额外的值,同时将它们保留为元组:

for r0 in itertools.product([0, 1], repeat=3):
    r0 = (0,) + r0 # keep r0 a tuple!
    for r1 in itertools.product([0, 1], repeat=3):
        r1 = (1,) + r1 # same here
        # ...
由于您没有显示您使用
rN
变量的目的,因此不可能给您一个明确的答案,告诉您什么是最好的方法。(你对变量进行编号有点代码味。)事实上,由于你的循环只是简单地计算另外三个
0
1
数字,你可能只需要一个
产品
调用,就可以一次生成一个
n
不同
r
值的列表:

for bits in itertools.product([0, 1], repeat=3*n):
    rs = [(i,) + bits[3*i:3*i+3] for i in range(n)]
    # do something with the list of r tuples here