Home > OS >  list of unique elements formed by concatenating permutations of the initial lists
list of unique elements formed by concatenating permutations of the initial lists

Time:02-04

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

CodePudding user response:

list_t = [[0, 7], [2, 4], [0, 1, 7], [0, 1, 4, 7]]
set_t =set()
def set_numbers(list_t):
  global set_t 
  for items in list_t:
    if isinstance(items,list):
      set_numbers(items)
    else:
      set_t.add(items)
  return list(set_t)

print(set_numbers(list_t)) # [0, 1, 2, 4, 7]


or

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

def set_numbers(list_t,set_t=set()):
  for items in list_t:
    if isinstance(items,list):
      set_numbers(items)
    else:
      set_t.add(items)
  return list(set_t)

print(set_numbers(list_t))

CodePudding user response:

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!

  •  Tags:  
  • Related