2014-12-07 2 views
0

В частности, я смотрю, есть ли какой-то метод cartesian_product(), встроенный в python, или способ сделать это с помощью itertools, не нужно писать вложенный многомерный цикл.python: как я могу получить декартовое произведение всех списков в списке?

, например, я следующий

input = [ 
    [1], 
    [[2]], 
    [3], 
    [[a,b,c] , [[z,x,y]] , [d,f,g]], 
    4 
] 

ожидал:

output = [ 
    [1,2,3,a,b,c,4] 
    [1,2,3,z,x,y,4] 
    [1,2,3,d,f,g,4] 
] 

Один частности задача состоит в том, что, как и в приведенном выше списке ввода, элемент может иметь любой слой списков, но должны быть в состоянии игнорировать все эти и все еще производить сплющенный результат.

+1

Пример не декартовой продукции! – alfasin

+1

Кроме того, 'input' - это ключевое слово в python - do * not * использовать его как имя переменной! – alfasin

+0

Связанный: http://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a-series-of-lists-in-python – dmcc

ответ

2

Чтобы добавить сверху ответ @ rorra, для того, чтобы напечатать результаты «сплющенные», добавьте следующую функцию:

def flat(l): 
    def _flat(l, r):  
     if type(l) is not list: 
      r.append(l) 
     else: 
      for i in l: 
       r = r + flat(i) 
     return r 
    return _flat(l, []) 

, а затем (код rorra с небольшой модификацией):

_input = [ 
    [1], 
    [[2]], 
    [3], 
    [['a','b','c'] , [['z','x','y']], ['d','f','g']], 
    4 
] 

_input = map(lambda(x): x if isinstance(x, list) else [x], _input) 

import itertools 
for element in itertools.product(*_input): 
    print flat(list(element)) # this line was modified 

ВЫВОД

[1, 2, 3, 'a', 'b', 'c', 4] 
[1, 2, 3, 'z', 'x', 'y', 4] 
[1, 2, 3, 'd', 'f', 'g', 4] 
3
input = [ 
    [1], 
    [[2]], 
    [3], 
    [['a','b','c'] , [['z','x','y']], ['d','f','g']], 
    4 
] 

input = map(lambda(x): x if isinstance(x, list) else [x], input) 

import itertools 
for element in itertools.product(*input): 
    print element 
+0

Вы изменили ввод из int '4' в список '[4]'? –

+0

Да, для использования itertools.product, просто конвертируйте любое скалярное anto-список – rorra

+0

Да, это правда, но я думаю, что это должно было быть включено в экспломацию кода вместо ручного обновления ввода? –