2017-03-01 89 views
-1

给定一个多维列表(列表的列表)我想获得所有可能的子列表项的组合。跨多个列表的所有组合

。例如输入:

my_list = [ 
    ['a', 'b'], ['1', '2'], ['@', '&'] 
] 

会导致:

result = [ 
['a'], 
['b'], 
['1'], 
['2'], 
['@'], 
['&'], 
['a', '1'], 
['a', '2'], 
['a', '@'], 
['a', '&'] 
['b', '1'], 
['b', '2'], 
['b', '@'], 
['b', '&'], 
['a', '1', '@'], 
['a', '1', '&'], 
['a', '2', '@'], 
['a', '2', '&'], 
...] 

我尝试使用itertools.product(*名单),但结果中的所有项目的不小组合组合。似乎itertools.combinations,itertools.permutations等不完全给我所寻找的。

有没有一种快速的方法来做到这一点?

+0

应,例如'['1','@']'出现在输出中? – chepner

+0

什么不清楚?我试图获得多个列表的所有项目的组合。我没有故意不清楚。如果你帮忙解释你不明白的事情,我会努力做出更明确的表达。 – Ripster

+0

“多个列表的所有项目的组合”仍然非常模糊。你有一些关于如何绘制物品的心理模型,以及哪些应该或不应该被视为有效的组合,这对你来说似乎很明显,但并不明显。你需要明确地说出来。 – user2357112

回答

3

在这种情况下,你首先迭代所有可能的长度。对于每一个长度为你挑选列出的所有可能的组合,并为每一个组合使用itertools.product

def weird_product(*data): 
    for i in range(1,len(data)+1): 
     for subdata in itertools.combinations(data,i): 
      for elem in itertools.product(*subdata): 
       yield elem 

这产生:

>>> list(weird_product(*data)) 
[('a',), ('b',), ('1',), ('2',), ('@',), ('&',), ('a', '1'), ('a', '2'), ('b', '1'), ('b', '2'), ('a', '@'), ('a', '&'), ('b', '@'), ('b', '&'), ('1', '@'), ('1', '&'), ('2', '@'), ('2', '&'), ('a', '1', '@'), ('a', '1', '&'), ('a', '2', '@'), ('a', '2', '&'), ('b', '1', '@'), ('b', '1', '&'), ('b', '2', '@'), ('b', '2', '&')] 

或更优雅格式:

>>> list(weird_product(*data)) 
[('a',), 
('b',), 
('1',), 
('2',), 
('@',), 
('&',), 
('a', '1'), 
('a', '2'), 
('b', '1'), 
('b', '2'), 
('a', '@'), 
('a', '&'), 
('b', '@'), 
('b', '&'), 
('1', '@'), 
('1', '&'), 
('2', '@'), 
('2', '&'), 
('a', '1', '@'), 
('a', '1', '&'), 
('a', '2', '@'), 
('a', '2', '&'), 
('b', '1', '@'), 
('b', '1', '&'), 
('b', '2', '@'), 
('b', '2', '&')]