itertools.product - 返回列表而不是元组
Posted
技术标签:
【中文标题】itertools.product - 返回列表而不是元组【英文标题】:itertools.product - return list instead of tuple 【发布时间】:2014-04-05 16:10:24 【问题描述】:我希望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()
代码来自 Python 文档 - 我刚刚修改了最后一行。这工作正常,但似乎不是很聪明。
还有哪些其他方法可以做到这一点?我正在考虑使用decorator
之类的东西,或者用我自己的生成器函数包装它。我对这两个概念都不太熟悉,如果有人能告诉我,我将不胜感激。
编辑 我正在做这样的乱七八糟的事情:
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)
所以我希望我的函数返回一个列表,而不是每次都强制转换它。 (我知道代码很乱,需要递归,但我稍后会考虑。我更感兴趣的是学习如何做我上面描述的)
【问题讨论】:
【参考方案1】:itertools.product
是一个生成器,您可以轻松地将生成器链接在一起。这是一个生成器表达式,它将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
数字,你也许可以通过一个product
调用逃脱,一次性生成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
【讨论】:
以上是关于itertools.product - 返回列表而不是元组的主要内容,如果未能解决你的问题,请参考以下文章
itertools.product的Numpy等价物[重复]
Python itertools.product 具有可变数量的参数