20 lines
607 B
Python
20 lines
607 B
Python
|
from itertools import filterfalse
|
||
|
|
||
|
|
||
|
def unique_everseen(iterable, key=None):
|
||
|
"List unique elements, preserving order. Remember all elements ever seen."
|
||
|
# unique_everseen('AAAABBBCCDAABBB') --> A B C D
|
||
|
# unique_everseen('ABBCcAD', str.lower) --> A B C D
|
||
|
seen = set()
|
||
|
seen_add = seen.add
|
||
|
if key is None:
|
||
|
for element in filterfalse(seen.__contains__, iterable):
|
||
|
seen_add(element)
|
||
|
yield element
|
||
|
else:
|
||
|
for element in iterable:
|
||
|
k = key(element)
|
||
|
if k not in seen:
|
||
|
seen_add(k)
|
||
|
yield element
|