2013-03-28 72 views
0

我有三個列表(L1,L2,L3),像不一定是全部名單:產品,同時

L1 = [1,2] 
L2 = ['a','b'] 
L3 = ['A','B'] 

我想計算L1 * L2 * L3的產品,id est,

itertools.product(L1,L2,L3) = [ [1,'a','A'], [1,'a','B'], ... ] 

但我想採取或不考慮一些名單;因此,[1,],[1,'a']將是結果的一部分,如['a',],['a','B']等。

任何想法來幫助我?謝謝 !

+3

你是什麼意思,「我想採取或不考慮一些名單」?你給的清單應該有什麼結果? – interjay

+0

我希望[1,'a']作爲結果的一部分(=在這裏,L3被忽略)或[2,'B'](=在這裏,L2被忽略),等等,再加上通常的結果使用三個列表[1,'a','A'],[1,'a','B],... – suizokukan

+0

所以你想要列出每個給定列表中包含零個或一個項目的所有列表? – interjay

回答

3

使用itertools examples中給出的powerset函數。 powerset([L1,L2,L3])將爲您提供3組列表的所有子集。對於每個子集,您可以採用笛卡爾產品,然後將它們鏈接在一起。

>>> from itertools import chain, product 
>>> result = chain.from_iterable(product(*lists) for lists in powerset([L1,L2,L3]))   
>>> list(result) 

[(), (1,), (2,), ('a',), ('b',), ('A',), ('B',), (1, 'a'), (1, 'b'), (2, 'a'), 
(2, 'b'), (1, 'A'), (1, 'B'), (2, 'A'), (2, 'B'), ('a', 'A'), ('a', 'B'), 
('b', 'A'), ('b', 'B'), (1, 'a', 'A'), (1, 'a', 'B'), (1, 'b', 'A'), 
(1, 'b', 'B'), (2, 'a', 'A'), (2, 'a', 'B'), (2, 'b', 'A'), (2, 'b', 'B')] 
+0

非常感謝:我不知道這個功能。 – suizokukan