Get a list of tuple lists by combining tuple elements?

I have a list of tuples that I am trying to get from a product by combining the individual elements of a tuple.

For example:

lists = [
    [(1,), (2,), (3,)],
    [(4,), (5,), (6,)]
]
p = itertools.product(*lists)
for product in p:
    print product

This leads to a set of tuples of tuples:

((1,), (4,))
((1,), (5,))
((1,), (6,))
((2,), (4,))
((2,), (5,))
((2,), (6,))
((3,), (4,))
((3,), (5,))
((3,), (6,))

What I want is a list of tuples, for example:

(1,4)
(1,5)
(1,6)
(2,4)
(2,5)
(2,6)
(3,4)
(3,5)
(3,6)

I also need this to be for any number of source tuple lists.

So in case 3:

lists = [
    [(1,), (2,), (3,)],
    [(4,), (5,), (6,)],
    [(7,), (8,), (9,)]
]
p = itertools.product(*lists)
for product in p:
    print product

I would like:

(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)
+4
source share
3 answers

You can simply use itertools.chain.from_iterableto smooth inner tuples, for example

for product in p:
    print tuple(itertools.chain.from_iterable(product))

For example,

>>> 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)]
+4
source

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))
0

,

lists = [[x[0] for x in tup] for tup in lists] #flatten
from itertools import product
for p in product(*lists):
    print p

This first line with the addition comment, converts your list object to look more like [ [1,2,3] , [4,5,6]], and then you can use the itertools product function as before.

0
source

Source: https://habr.com/ru/post/1623369/


All Articles