Вырезать и вставить из рецептов itertools
from itertools import ifilterfalse
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 ifilterfalse(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
Мне очень жаль, что они не смогли бы сделать модуль из этих рецептов в ближайшее время. Мне очень хотелось бы иметь возможность делать from itertools_recipes import unique_everseen
вместо использования вырезания и вставки каждый раз, когда мне что-то понадобится.
Используйте так:
def unique_words(string, ignore_case=False):
key = None
if ignore_case:
key = str.lower
return " ".join(unique_everseen(string.split(), key=key))
string2 = unique_words(string1)