I didn't see answers for non-hashable values, one liner, n log n, standard-library only, so here's my answer:
list(map(operator.itemgetter(0), itertools.groupby(sorted(items))))
Or as a generator function:
def unique(items: Iterable[T]) -> Iterable[T]:
"""For unhashable items (can't use set to unique) with a partial order"""
yield from map(operator.itemgetter(0), itertools.groupby(sorted(items)))