# -*- coding: utf-8 -*- def drop_duplicates(elements): return list(set(elements)) def flatten(items, acc = None): """Flatten a tuple or a list of tuples or of lists and return it as a flat list""" if acc is None: return flatten(items, []) if type(items) == tuple: return flatten(list(items), acc) if items == []: return acc first_item = items.pop(0) if type(first_item) == list: return flatten(first_item + items, acc) if type(first_item) == tuple: return flatten(list(first_item) + items, acc) else: acc.append(first_item) return flatten(items, acc) def substract(list_1, list_2): """Returns the list_1 without the elements contained in list_2, assuming that there is no duplicates""" return list(set(list_1) - set(list_2)) if __name__ == "__main__": assert [] == substract([], []) assert [] == substract([], [1]) assert [] == substract([1], [1]) assert [] == substract([1], [1, 1]) assert [] == substract([1, 1], [1]) assert [] == substract([1, 1], [1, 1]) assert [2] == substract([1, 2], [1]) list_1 = [1, 2, 3] assert [2, 3] == substract(list_1, [1]) assert list_1 == [1, 2, 3] assert [] == drop_duplicates([]) assert [1] == drop_duplicates([1]) assert [1, 2] == drop_duplicates([1, 2]) assert [1, 2] == drop_duplicates([1, 1, 2]) assert flatten([]) == [] assert flatten([1]) == [1] assert flatten([1, 2]) == [1, 2] assert flatten([1, 2, []]) == [1, 2] assert flatten([1, [], 2]) == [1, 2] assert flatten([1, [2, 3], 4]) == [1, 2, 3, 4] assert flatten((1, [2, 3], 4)) == [1, 2, 3, 4] assert flatten((1, (2, 3), 4)) == [1, 2, 3, 4]