Уникальные элементы последовательности
Напоследок напишем функцию, выводящую все уникальные элементы в том же порядке, как они появлялись в исходной последовательности. Опциональный аргумент – ссылка на функцию определения эквивалентов, представленных по-разному. Например, заглавных и строчных букв.
def unique_everseen(iterable, key=None):
seen = set()
seen_add = seen.add
if key is None:
for element in itertools.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
>>> list(unique_everseen('Абракадааааабра'))
['А', 'б', 'р', 'а', 'к', 'д']
>>> list(unique_everseen('Абракадааааабра', str.lower))
['А', 'б', 'р', 'к', 'д']