Home > database >  return unique python lists of chars ignoring order
return unique python lists of chars ignoring order

Time:10-19

Problem:

Consider a python list of lists that contains a sequence of chars:

[['A', 'B'],['A','B','C'],['B','A'],['C','A','B'],['D'],['D'],['Ao','B']]

The goal is to return the unique lists, regardless of order:

[['A','B'],['A','B','C'],['D'],['Ao','B']]

Attempt:

I'm able to achieve my goal using many if/else statements with try/exceptions. What would be the most pythonic (faster) way to approach this problem? Thanks!

def check_duplicates(x,list_):
    for li in list_:
        if compare(x,li):
            return True
   

def compare(s, t):
    t = list(t)   # make a mutable copy
    try:
        for elem in s:
            t.remove(elem)
    except ValueError:
        return False
    return not t

vars_list = [['A', 'B'],['A','B','C'],['B','A'],['C','A','B'],['D'],['D'],['Ao','B']]

second_list = []
for i in vars_list:
    if check_duplicates(i,second_list):
        continue
    else:
        second_list.append(i)
        print(i)
    

CodePudding user response:

Assuming that the elements of the nested lists are hashable, you can isolate the unique collections by constructing a set of frozensets from the nested list:

unique_sets = {frozenset(l) for l in vars_list}
# {frozenset({'D'}),
#  frozenset({'A', 'B'}),
#  frozenset({'A', 'B', 'C'}),
#  frozenset({'Ao', 'B'})}

If you need a list-of-lists as the output, you can obtain one trivially with [list(s) for s in unique_sets].

  • Related