2017-03-01 73 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', '&')]