Search code examples
pythonlistconcatenationpermutation

list of unique elements formed by concatenating permutations of the initial lists


I would like to combine several lists, each lists should be preserved up to a permutation.

Here is an example:

I would like to combine these lists

[[0, 7], [2, 4], [0, 1, 7], [0, 1, 4, 7]]

The output I would like to obtain is e.g. this list

 [2, 4, 0, 7, 1]

Or as Sembei Norimaki phrased the task:

the result must be a list of unique elements formed by concatenating permutations of the initial lists.

The solution is not unique, and it could be that there is not always a solution possible


Solution

  • Third time lucky. This is a bit cheesy - it checks every permutation of the source list elements to see which ones are valid:

    from itertools import permutations
    
    
    def check_sublist(sublist, candidate):
        # a permutation of sublist must exist within the candidate list
        sublist = set(sublist)
        # check each len(sublist) portion of candidate
        for i in range(1 + len(candidate) - len(sublist)):
            if sublist == set(candidate[i : i + len(sublist)]):
                return True
        return False
    
    
    def check_list(input_list, candidate):
        for sublist in input_list:
            if not check_sublist(sublist, candidate):
                return False
        return True
    
    
    def find_candidate(input_list):
        # flatten input_list and make set of unique values
        values = {x for sublist in input_list for x in sublist}
        for per in permutations(values):
            if check_list(input_list, per):
                print(per)
    
    
    find_candidate([[0, 7], [2, 4], [0, 1, 7], [0, 1, 4, 7]])
    # (0, 7, 1, 4, 2)
    # (1, 0, 7, 4, 2)
    # (1, 7, 0, 4, 2)
    # (2, 4, 0, 7, 1)
    # (2, 4, 1, 0, 7)
    # (2, 4, 1, 7, 0)
    # (2, 4, 7, 0, 1)
    # (7, 0, 1, 4, 2)
    

    You'd definitely do better applying a knowledge of graph theory and using a graphing library, but that's beyond my wheelhouse at present!