0

I have a list which contains few number of elements and I'd like to find all possibilities to split this list into two list.

I mean, all combinations mean I wouldn't care about its element order. i.e. if element 2 and 3 are in the one list, element 1 in the other. ([2,3],[1]) == ([1],[2,3])

Here is what I tried:

import itertools

input_list = [10, 5, 15, 20, 25]
subset1, subset2, subsets = [], [], []


#sort input list
stuff = list(input_list)
stuff.sort()

#Find all possible [0] positions of given list
for L in range(0, len(stuff)+1):
    for subset in itertools.permutations(stuff, L):
        temp1 = list(subset)
        temp1.sort()
        if temp1 not in subset1:
            subset1.append(list(temp1))

#find all possible [1] positions 
for L2 in range(len(subset1)):
    temp2 = list( set(stuff) - set(subset1[L2]))
    temp2.sort()
    subset2.append(temp2)

#combine two position lists and filter out same combination  
for L3 in range(len(subset1)):
    temp3 = [subset1[L3],subset2[L3]]

    temp3.sort()

    #filter out same combination result but different order
    if temp3 not in subsets:
        subsets.append(temp3)

When I ran this code, I found out few number of my subsets list's elements contain unexpected tuple data, like [[5, 25], [10, 15, 20], ([5, 15, 25], [10, 20])].

I'm totally confused where those tuple type data is came from. Could someone point out thing what I missed?

Thank you

Arno
  • 3
  • 2
  • 1
    Does this answer your question? [All possibilities to split a list into two lists](https://stackoverflow.com/questions/40709488/all-possibilities-to-split-a-list-into-two-lists) – Thierry Lathuille Nov 18 '19 at 06:36

1 Answers1

0

When I execute your code, I get the output

[[[], [5, 10, 15, 20, 25]], [[5], [10, 15, 20, 25]], [[5, 15, 20, 25], [10]], [[5, 10, 20, 25], [15]], [[5, 10, 15, 25], [20]], [[5, 10, 15, 20], [25]], [[5, 10], [15, 20, 25]], [[5, 15], [10, 20, 25]], [[5, 20], [10, 15, 25]], [[5, 25], [10, 15, 20]], [[5, 20, 25], [10, 15]], [[5, 15, 25], [10, 20]], [[5, 15, 20], [10, 25]], [[5, 10, 25], [15, 20]], [[5, 10, 20], [15, 25]], [[5, 10, 15], [20, 25]]]

without any tuples in it. One simpler solution using itertools could be

def two_partitions(S):
    res_list = []
    for l in range(0,int(len(S)/2)+1):
        combis = set(itertools.combinations(S,l))
        for c in combis:
            res_list.append((sorted(list(c)), sorted(list(S-set(c)))))
    return res_list

two_partitions({10, 5, 15, 20, 25})

You may or may not need the sorting of the sublists

ctenar
  • 718
  • 5
  • 24