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
                ]
4
  • 1
    What about this stackoverflow.com/a/464882/7799587 ? Commented Apr 30, 2020 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. Commented Apr 30, 2020 at 19:07
  • Thanks, I forgot [[A], [B], [C, D]] and similar ones. They have to be in the output! Commented Apr 30, 2020 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. Commented Apr 30, 2020 at 19:32

3 Answers 3

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']]
Sign up to request clarification or add additional context in comments.

3 Comments

The output is right but print(ls) only gives out <generator object f at 0x7f6e8e2c9ba0> . How do I get to your output?
Call list() on the result. Or loop over the result, like for x in f(ls): print(x).
Thanks. After getting the error "...is not iterable" and putting your solution into a clean .py file it is working and pretty much solves my problem.
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'], []]]

1 Comment

This is missing items like [[A], [B], [C, D]].
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?

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.