summaryrefslogtreecommitdiff
path: root/itertoolset.py
diff options
context:
space:
mode:
Diffstat (limited to 'itertoolset.py')
-rw-r--r--itertoolset.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/itertoolset.py b/itertoolset.py
index 13bb896..ae4be8a 100644
--- a/itertoolset.py
+++ b/itertoolset.py
@@ -1,4 +1,4 @@
-from itertools import cycle, islice
+from itertools import *
def roundrobin(*iterables):
"""roundrobin('ABC', 'D', 'EF') --> A D E B F C"""
@@ -11,3 +11,20 @@ def roundrobin(*iterables):
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
+
+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