2016-01-08 2 views
4

У меня есть список кортежей, которые я пытаюсь получить, объединяя отдельные элементы кортежа.Получите список списков кортежей, объединив элементы кортежа?

Например:

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) 

ответ

4

Вы можете просто использовать 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)] 
+0

Это относится к списку размеров n? – PyNEwbie

+0

@PyNEwbie Да, это так. – thefourtheye

+0

Прохладный, я должен был сделать это, прежде чем я спросил - это выглядит круто – PyNEwbie

0

вы также можете использовать 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 

Эта первая строка с комментарием сложения, преобразует ваш объект списка, чтобы выглядеть больше как [ [1,2,3] , [4,5,6]], а затем вы можете использовать функцию продукта itertools, как раньше.

Смежные вопросы