2

How do I get a list containing all possible combinations of contents from another list?

Example:

list = [A, B, C, D]

-->(magic iteration)-->

combinations = [[A, B, C, D],
                [[A], [B], [C], [D]],
                [[A], [B, C, D]],
                [[B], [A, C, D]],
                [[C], [A, B, D]],
                [[D], [A, B, C]],
                [[A, B], [C, D]],
                [[A, C], [B, D]],
                [[A, D], [B, C]],
                [[A], [B], [C, D]]
                # and so on
                ]
robot987
  • 45
  • 4
  • 1
    What about this https://stackoverflow.com/a/464882/7799587 ? – João Victor Apr 30 '20 at 19:06
  • 1
    Its not entirely clear what your criteria for splitting things up is. Can you get `[[A], [B], [C, D]]`? It's not listed in your output, but should be possible if you really do want every way the values can be partitioned. – Blckknght Apr 30 '20 at 19:07
  • Thanks, I forgot [[A], [B], [C, D]] and similar ones. They have to be in the output! – robot987 Apr 30 '20 at 19:11
  • João Victor , as I see it, the output with your solution and [A, B, C] would be: () (A,) (B,) (C,) (A, B) (A, C) (B, C) (A, B, C) . But there should be all elements in every combination. – robot987 Apr 30 '20 at 19:32

3 Answers3

1

Try this:

from itertools import combinations
from functools import reduce
import operator
lst = ['A', 'B', 'C', 'D']
res = [[[list(x), list(set(lst) - set(x))]for x in combinations(lst, i + 1)] for i in range(len(lst))]
reduce(operator.iconcat, res, [])

Output:

[[['A'], ['C', 'B', 'D']],
 [['B'], ['A', 'C', 'D']],
 [['C'], ['A', 'D', 'B']],
 [['D'], ['A', 'C', 'B']],
 [['A', 'B'], ['C', 'D']],
 [['A', 'C'], ['D', 'B']],
 [['A', 'D'], ['C', 'B']],
 [['B', 'C'], ['A', 'D']],
 [['B', 'D'], ['A', 'C']],
 [['C', 'D'], ['A', 'B']],
 [['A', 'B', 'C'], ['D']],
 [['A', 'B', 'D'], ['C']],
 [['A', 'C', 'D'], ['B']],
 [['B', 'C', 'D'], ['A']],
 [['A', 'B', 'C', 'D'], []]]
deadshot
  • 8,881
  • 4
  • 20
  • 39
1

This seems to meet all your requirements:

import itertools                                                                                                                                                                                                                                                                                                              

def f(ls):                                                                                                                                                                                                                                                                                                                    
  if not ls:                                                                                                                                                                                                                                                                                                                  
    yield []

  for i in range(1, len(ls) + 1):                                                                                                                                                                                                                                                                                             
    for combo in itertools.combinations(ls, i):                                                                                                                                                                                                                                                                               
      for rest in f(set(ls) - set(combo)):                                                                                                                                                                                                                                                                                    
        yield [list(combo), *rest]                                                                                                                                                                                                                                                                                            

Output:

[['A'], ['C'], ['B'], ['D']]                                                                                                                                                                                                                                                                                                  
[['A'], ['C'], ['D'], ['B']]                                                                                                                                                                                                                                                                                                  
[['A'], ['C'], ['B', 'D']]                                                                                                                                                                                                                                                                                                    
[['A'], ['B'], ['C'], ['D']]                                                                                                                                                                                                                                                                                                  
[['A'], ['B'], ['D'], ['C']]
[['A'], ['B'], ['C', 'D']]
[['A'], ['D'], ['C'], ['B']]
[['A'], ['D'], ['B'], ['C']]
[['A'], ['D'], ['C', 'B']]
[['A'], ['C', 'B'], ['D']]
[['A'], ['C', 'D'], ['B']]
[['A'], ['B', 'D'], ['C']]
[['A'], ['C', 'B', 'D']]
[['B'], ['C'], ['A'], ['D']]
[['B'], ['C'], ['D'], ['A']]
[['B'], ['C'], ['A', 'D']]
[['B'], ['A'], ['C'], ['D']]
[['B'], ['A'], ['D'], ['C']]
[['B'], ['A'], ['C', 'D']]
[['B'], ['D'], ['C'], ['A']]
[['B'], ['D'], ['A'], ['C']]
[['B'], ['D'], ['C', 'A']]
[['B'], ['C', 'A'], ['D']]
[['B'], ['C', 'D'], ['A']]
[['B'], ['A', 'D'], ['C']]
[['B'], ['C', 'A', 'D']]
[['C'], ['B'], ['A'], ['D']]
[['C'], ['B'], ['D'], ['A']]
[['C'], ['B'], ['A', 'D']]
[['C'], ['A'], ['B'], ['D']]
[['C'], ['A'], ['D'], ['B']]
[['C'], ['A'], ['B', 'D']]
[['C'], ['D'], ['B'], ['A']]
[['C'], ['D'], ['A'], ['B']]
[['C'], ['D'], ['B', 'A']]
[['C'], ['B', 'A'], ['D']]
[['C'], ['B', 'D'], ['A']]
[['C'], ['A', 'D'], ['B']]
[['C'], ['B', 'A', 'D']]
[['D'], ['C'], ['B'], ['A']]
[['D'], ['C'], ['A'], ['B']]
[['D'], ['C'], ['B', 'A']]
[['D'], ['B'], ['C'], ['A']]
[['D'], ['B'], ['A'], ['C']]
[['D'], ['B'], ['C', 'A']]
[['D'], ['A'], ['C'], ['B']]
[['D'], ['A'], ['B'], ['C']]
[['D'], ['A'], ['C', 'B']]
[['D'], ['C', 'B'], ['A']]
[['D'], ['C', 'A'], ['B']]
[['D'], ['B', 'A'], ['C']]
[['D'], ['C', 'B', 'A']]
[['A', 'B'], ['C'], ['D']]
[['A', 'B'], ['D'], ['C']]
[['A', 'B'], ['C', 'D']]
[['A', 'C'], ['B'], ['D']]
[['A', 'C'], ['D'], ['B']]
[['A', 'C'], ['B', 'D']]
[['A', 'D'], ['C'], ['B']]
[['A', 'D'], ['B'], ['C']]
[['A', 'D'], ['C', 'B']]
[['B', 'C'], ['A'], ['D']]
[['B', 'C'], ['D'], ['A']]
[['B', 'C'], ['A', 'D']]
[['B', 'D'], ['C'], ['A']]
[['B', 'D'], ['A'], ['C']]
[['B', 'D'], ['C', 'A']]
[['C', 'D'], ['B'], ['A']]
[['C', 'D'], ['A'], ['B']]
[['C', 'D'], ['B', 'A']]
[['A', 'B', 'C'], ['D']]
[['A', 'B', 'D'], ['C']]
[['A', 'C', 'D'], ['B']]
[['B', 'C', 'D'], ['A']]
[['A', 'B', 'C', 'D']]
Brian McCutchon
  • 8,354
  • 3
  • 33
  • 45
0
from itertools import combinations

elements = ["A", "B", "C", "D"]

total = []
for r in range(1, len(elements) + 1):
    total.extend(combinations(elements, r))

print(total)
[('A',), ('B',), ('C',), ('D',), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D'), ('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), ('B', 'C', 'D'), ('A', 'B', 'C', 'D')]

something like that?