通过组合元组元素获取元组列表的产品?
Get product of lists of tuples by combining tuple elements?
我有一个元组列表,我试图通过组合各个元组元素来获取其乘积。
例如:
lists = [
[(1,), (2,), (3,)],
[(4,), (5,), (6,)]
]
p = itertools.product(*lists)
for product in p:
print product
这导致一堆元组的元组:
((1,), (4,))
((1,), (5,))
((1,), (6,))
((2,), (4,))
((2,), (5,))
((2,), (6,))
((3,), (4,))
((3,), (5,))
((3,), (6,))
我想要的是像这样的元组列表:
(1,4)
(1,5)
(1,6)
(2,4)
(2,5)
(2,6)
(3,4)
(3,5)
(3,6)
我还需要这个来保存任意数量的元组初始列表。
所以在 3 的情况下:
lists = [
[(1,), (2,), (3,)],
[(4,), (5,), (6,)],
[(7,), (8,), (9,)]
]
p = itertools.product(*lists)
for product in p:
print product
我愿意:
(1, 4, 7)
(1, 4, 8)
(1, 4, 9)
(1, 5, 7)
(1, 5, 8)
(1, 5, 9)
(1, 6, 7)
(1, 6, 8)
(1, 6, 9)
(2, 4, 7)
(2, 4, 8)
(2, 4, 9)
(2, 5, 7)
(2, 5, 8)
(2, 5, 9)
(2, 6, 7)
(2, 6, 8)
(2, 6, 9)
(3, 4, 7)
(3, 4, 8)
(3, 4, 9)
(3, 5, 7)
(3, 5, 8)
(3, 5, 9)
(3, 6, 7)
(3, 6, 8)
(3, 6, 9)
您可以简单地使用 itertools.chain.from_iterable
来展平内部元组,就像这样
for product in p:
print tuple(itertools.chain.from_iterable(product))
例如,
>>> from itertools import chain, product
>>> [tuple(chain.from_iterable(prod)) for prod in product(*lists)]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
你也可以使用map
或imap
与sum
或@thefourtheye的解决方案来得到想要的结果
from itertools import product, chain, imap
p1 = imap(lambda x:sum(x,tuple()),product(*lists))
p2 = imap(lambda x:tuple(chain.from_iterable(x)),product(*lists))
正如其他一些人提到的,最好先将列表展平
lists = [[x[0] for x in tup] for tup in lists] #flatten
from itertools import product
for p in product(*lists):
print p
带有 flatten 注释的第一行会将您的列表对象转换为看起来更像 [ [1,2,3] , [4,5,6]]
然后您可以像以前一样使用 itertools product 函数。
我有一个元组列表,我试图通过组合各个元组元素来获取其乘积。
例如:
lists = [
[(1,), (2,), (3,)],
[(4,), (5,), (6,)]
]
p = itertools.product(*lists)
for product in p:
print product
这导致一堆元组的元组:
((1,), (4,))
((1,), (5,))
((1,), (6,))
((2,), (4,))
((2,), (5,))
((2,), (6,))
((3,), (4,))
((3,), (5,))
((3,), (6,))
我想要的是像这样的元组列表:
(1,4)
(1,5)
(1,6)
(2,4)
(2,5)
(2,6)
(3,4)
(3,5)
(3,6)
我还需要这个来保存任意数量的元组初始列表。
所以在 3 的情况下:
lists = [
[(1,), (2,), (3,)],
[(4,), (5,), (6,)],
[(7,), (8,), (9,)]
]
p = itertools.product(*lists)
for product in p:
print product
我愿意:
(1, 4, 7)
(1, 4, 8)
(1, 4, 9)
(1, 5, 7)
(1, 5, 8)
(1, 5, 9)
(1, 6, 7)
(1, 6, 8)
(1, 6, 9)
(2, 4, 7)
(2, 4, 8)
(2, 4, 9)
(2, 5, 7)
(2, 5, 8)
(2, 5, 9)
(2, 6, 7)
(2, 6, 8)
(2, 6, 9)
(3, 4, 7)
(3, 4, 8)
(3, 4, 9)
(3, 5, 7)
(3, 5, 8)
(3, 5, 9)
(3, 6, 7)
(3, 6, 8)
(3, 6, 9)
您可以简单地使用 itertools.chain.from_iterable
来展平内部元组,就像这样
for product in p:
print tuple(itertools.chain.from_iterable(product))
例如,
>>> from itertools import chain, product
>>> [tuple(chain.from_iterable(prod)) for prod in product(*lists)]
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
你也可以使用map
或imap
与sum
或@thefourtheye的解决方案来得到想要的结果
from itertools import product, chain, imap
p1 = imap(lambda x:sum(x,tuple()),product(*lists))
p2 = imap(lambda x:tuple(chain.from_iterable(x)),product(*lists))
正如其他一些人提到的,最好先将列表展平
lists = [[x[0] for x in tup] for tup in lists] #flatten
from itertools import product
for p in product(*lists):
print p
带有 flatten 注释的第一行会将您的列表对象转换为看起来更像 [ [1,2,3] , [4,5,6]]
然后您可以像以前一样使用 itertools product 函数。