2017-03-01 8 views
-1

Angesichts einer mehrdimensionalen Liste (eine Liste von Listen) Ich möchte alle möglichen Kombinationen der Unterlisten Elemente erhalten.Alle Kombinationen über mehrere Listen

Zum Beispiel eine Eingabe von:

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

ergäbe in:

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', '&'], 
...] 

Ich versuchte itertools.product (* Liste) aber, dass die Ergebnisse in einer Kombination aller Elemente ohne die kleineren mit Sätze von Kombinationen. Es scheint, dass iertools.combinations, itertools.permutations usw. nicht ganz geben, wonach ich suche.

Gibt es eine schnelle Möglichkeit, dies zu tun?

+0

Sollte B. '['1', '@']' in der Ausgabe erscheinen? – chepner

+0

Was ist unklar? Ich versuche eine Kombination aller Elemente mehrerer Listen zu erhalten. Ich bin nicht absichtlich unklar. Wenn Sie mir helfen zu erklären, was Sie nicht verstehen, werde ich versuchen, deutlicher zu artikulieren. – Ripster

+0

"eine Kombination aller Elemente von mehreren Listen" ist immer noch sehr vage. Sie haben ein mentales Modell, wie die Items gezeichnet werden sollen und was als gültige Kombination gelten soll oder nicht, was Ihnen offensichtlich erscheint, aber nicht offensichtlich ist. Sie müssen es explizit sagen. – user2357112

Antwort

3

In diesem Fall iterieren Sie zuerst alle möglichen Längen. Für jede Länge Sie alle möglichen Kombinationen von Auswahllisten, und für jede dieser Kombinationen verwenden Sie 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 

Dies erzeugt:

>>> 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', '&')] 

oder eleganter formatiert:

>>> 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', '&')] 
Verwandte Themen