summaryrefslogtreecommitdiff
path: root/itertoolset.py
diff options
context:
space:
mode:
authorStan Seibert <stan@mtrr.org>2011-06-21 20:59:54 -0400
committerStan Seibert <stan@mtrr.org>2011-06-21 20:59:54 -0400
commitff489255117030ea263225cd1bc7b2f4f151ed76 (patch)
treefd36717bab2f359850da42f80d45054e79216e47 /itertoolset.py
parent81c4bf14e0357b597570dbb551a37c54cc1806de (diff)
parentf04ecc51cd9d634a7c418a611946944b05c6bec4 (diff)
downloadchroma-ff489255117030ea263225cd1bc7b2f4f151ed76.tar.gz
chroma-ff489255117030ea263225cd1bc7b2f4f151ed76.tar.bz2
chroma-ff489255117030ea263225cd1bc7b2f4f151ed76.zip
Merge speedup of build()
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