2014-10-20 2 views
0

У меня есть список списков как таковых, нет. внутреннего списка неизвестно:Как перенести/объединить списки разных размеров? python

>>> x = [1,2,3] 
>>> y = [4,5,6,7] 
>>> z = [8] 
>>> lol = [x,y,z] 

мне нужно, чтобы получить комбинации из каждого пункта в пределах внутреннего списка в порядке lol списков, я делал это, как, например, чтобы получить желаемый результат:

>>> for i in x: 
...  for j in y: 
...    for k in z: 
...      print [i,j,k] 
... 
[1, 4, 8] 
[1, 5, 8] 
[1, 6, 8] 
[1, 7, 8] 
[2, 4, 8] 
[2, 5, 8] 
[2, 6, 8] 
[2, 7, 8] 
[3, 4, 8] 
[3, 5, 8] 
[3, 6, 8] 
[3, 7, 8] 

Что такое питонический способ сделать это? Есть ли функция itertools для этого?

Я попытался itertools.product, но я не получить желаемый результат:

>>> from itertools import product 
>>> for i in product(lol): 
...  print i 
... 
([1, 2, 3],) 
([4, 5, 6, 7],) 
([8],) 
+1

вы имели в виду 'продукт (* лол)'? – jonrsharpe

ответ

4

Вы были очень близки:

>>> for i in product(*lol): 
... print i 
... 
(1, 4, 8) 
(1, 5, 8) 
(1, 6, 8) 
(1, 7, 8) 
(2, 4, 8) 
(2, 5, 8) 
(2, 6, 8) 
(2, 7, 8) 
(3, 4, 8) 
(3, 5, 8) 
(3, 6, 8) 
(3, 7, 8) 

В doc, есть примеры, как product(A, B). Поэтому вы должны передать каждый список в качестве аргумента. В вашем случае product(x,y,z) сделал бы трюк. Обозначение *lol предназначено для unpacking.

4

itertools.product принимает отдельный аргумент для каждого набора, а не один итеративный, содержащий наборы.

for i in product(*lol): 
    print i 
0

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

import itertools 


x = [1,2,3] 
y = [4,5,6,7] 
z = [8] 
lol = [x,y,z] 

print [each for each in itertools.product(*lol)] # or set() 

[(1, 4, 8), (1, 5, 8), (1, 6, 8), (1, 7, 8), (2, 4, 8), (2, 5, 8), (2, 6, 8), (2, 7, 8), (3, 4, 8), (3, 5, 8), (3, 6, 8), (3, 7, 8)]