2015-10-06 107 views
1

我有一個清單,需要提取每個項目;最終編寫他們的笛卡爾產品。Python:從清單列表中提取

from itertools import product 

b = {} 
a = [[1, 2], [3, 4], ['a', 'b']] 

for i, v in enumerate(a): 
    b[i] = v 

#These don't work because we are feeding a single list to product 
print list(product(x for x in a)) # [([1, 2],), ([3, 4],), (['a', 'b'],)] 
print list(product(b.values())) # [([1, 2],), ([3, 4],), (['a', 'b'],)] 

product工作正常,如果我能得到這樣的:使用*

print list(product([1, 2], [3, 4], ['a', 'b'])) 
[(1, 3, 'a'), (1, 3, 'b'), (1, 4, 'a'), (1, 4, 'b'), (2, 3, 'a'), (2, 3, 'b'), (2, 4, 'a'), (2, 4, 'b')] 

回答

1

拆開aitertools.product。實施例 -

print list(product(*a)) 

啓封會的a各元件發送作爲單獨的參數爲product,而不是單個列表(正如 - list(product([1, 2], [3, 4], ['a', 'b'])))。

演示 -

>>> a = [[1, 2], [3, 4], ['a', 'b']] 
>>> from itertools import product 
>>> print(list(product(*a))) 
[(1, 3, 'a'), (1, 3, 'b'), (1, 4, 'a'), (1, 4, 'b'), (2, 3, 'a'), (2, 3, 'b'), (2, 4, 'a'), (2, 4, 'b')] 
+0

整潔。我多次見過'*'操作符。它到處都有類似的工作嗎? –

+1

在函數調用(像上面那樣)是的。但是當你在函數定義中使用它時,它是不同的。然後它意味着任何數量的位置參數(並且所有這些位置參數都會在'*'之後用名稱放入列表中)。 –

+0

是的,這意味着你希望允許任意數量的參數。正確嗎? –