Skip to content

Instantly share code, notes, and snippets.

@germn
Created November 7, 2015 08:19
Show Gist options
  • Save germn/e505837846fb6b866ffb to your computer and use it in GitHub Desktop.
Save germn/e505837846fb6b866ffb to your computer and use it in GitHub Desktop.
Universal function to return unique items in iterable
def unique_everseen(items: Iterable, get_hashable: Callable[[Any], Any]=None) -> Iterable:
"""
Returns generator of unique items.
If get_hashable(item) is not None or all elements hashable, fast method would be used.
"""
if callable(get_hashable):
seen = set()
return (i for i in items for h in (get_hashable(i),) if not (h in seen or seen.add(h)))
elif all(isinstance(i, collections.Hashable) for i in items):
seen = set()
return (i for i in items if not (i in seen or seen.add(i)))
else:
seen = list()
return (i for i in items if not (i in seen or seen.append(i)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment